1、Problem 11.24所提的解决方案的核心关键是能够检测出不同大小的气泡。我们在这里假定所有气泡都是圆的。提出的解决方案有以下五个部分构成:1)图像分割;2)后处理;3)气泡检索,确定与边缘融合的气泡;4)形状检测;5)计算气泡的面积占图像总面积的比例;1)分割图像:我们假定书上所给的图片能够代表实际系统当中出现的大部分图像。所给出的图像能够通过全局阈值进行分割。从图像的直方图(图 1)我们可以清楚得到我们感兴趣的区域的主要集中在直方图灰度级高的一侧。我们使用自动阈值分割算法,m 代表均值, 代表方差, 则阈值定为 m+2。在所给定的图像中我们计算出来的阈值为 195.分割的结果如图 2
2、所示,当然这只是一个比较通用的分割方法。图 1 图 22)后处理:从分割后的图像可以见到,气泡当中还有很多的黑色区域,这很有可能是由于反光或者气泡本身中空引起的。我们可以尝试对气泡进行修复或者填满气泡,但是使用形态学的操作必然会导致很多计算上的耗费,由于对精度没有一个具体的要求标准,这里我们就只对气泡做了简单的闭运算,效果如图 3 所示,后续可以根据实际系统所需要的精度来确定所需的形态学操作,在后面的面积比例计算当中我们也忽略不完整气泡所带来的面积误差。图 33)气泡的查找由图中我们可以清楚的知道气泡可以分为三类,一类是与边界有交集的气泡,一类是单独存在的气泡,最后是彼此交叠在一起的气泡。首先
3、对于与边界有交集的气泡,我们通过检测边界找到白色的像素点(白色代表气泡区域),然后通过联通区域查找获得与边界融合的气泡。其次去掉与边界融合的气泡的影响,对于彼此重叠的气泡和单个气泡可以通过气泡的面积来区分(或者形状),在有大量图像的基础下我们可以获得每个气泡的合理面积范围,以此来判断是否重叠。4)形状检测使用霍夫变化进行椭圆检测(气泡在上升的过程当中其实更多是呈椭圆形状)设定霍夫变换的阈值可以将单独的气泡检测出来。具体的阈值与实际要求的精度和大多数图片的检测效果来实际尝试后确定5)可分辨气泡数目的计算除去与边界融合的气泡,计算单独的气泡和交叠在一起的气泡的总数目就可得到可分辨气泡的数目。6)气
4、泡占总面积的比率这个比率就等于后处理后图中所有白色像素点的个数除以总的像素点的个数。所给的样本例子中气泡面积占总面积的比例大约为 7.7172%最后对于最小可检测的物理尺寸,如果我们在 4 当中将只有一个像素点的联通区域也算是一个气泡的话,那么对于 7cm 的 700X700 图像而言,最小的物理尺寸为 10mm。附原图和简易方案的 matlab 代码clcclearI=imread(534286416955055193.jpg); %读取原始图像warning offimshow(I,);title(原始图像); %显示原始图像figureimhist(I);title(直方 图图像);I1
5、=zeros(size(I,1),size(I,2); %初始化一个与原图一样大小的矩阵for i=1:size(I,1) %这两个 for 循环 是进行全局的阈值分割 for j=1:size(I,2)if I(i,j)230I1(i,j)=1;endendendfigureimshow(I1);title(二值图像);B=ones(25,25); %初始化形态 学操作的 单元figureI2=I1;th=7; %做七次的闭操作for i=1:th %for 循环, 闭操作,先腐蚀后膨胀I2=imdilate(I2,B);I2=imerode(I2,B);endimshow(I2);titl
6、e(闭运算图像);W1,W2=find(I2=1); %找到所有像素值为 1 的点PER=length(W1)/size(I,1)/size(I,2); %计算气泡占 图像总面积的比例disp(占,num2str(PER*100),%);L = bwlabel(I2,8); %二值图像中元素标记S = regionprops(L, Area); %统计被标记的区域面积分布bw2 = ismember(L, find(S.Area = 30); % 找出面积大于 30 个像素点的bw2 = imclearborder(bw2,8); % 去掉和边缘连接的点figureimshow(bw2);title(最终图像);L1 = bwlabel(bw2,8); %计算最终图像连通区域S1 = regionprops(L1, Area);NUM=size(S1,1); %计算出泡泡的个数disp(有,num2str(NUM),个泡泡);