1、一:问题描述
在一幅包含气泡的图像中,求出气泡面积占图像总面积的比例,并求出可分辨气泡的个数。(11.24 P562)
二:例子分析
针对上面的彩色图片,想到的方式是先转换成二值图像,然后进行边缘检测,在进行圆形填充,这样可以求出面积比例,最大的难度在气泡重叠的部分处理上,我想到的是要进行腐蚀处理,虽然结果并不精确,但也准确度还算可以。
三:matlab实现
I=imread('c:\Users\张达\Desktop\气泡.png')
i=rgb2gray(I)%将图片转换成灰度图像
figure
subplot(
2、231)
imshow(i)
title('灰度图像')
[m,n]=size(i)%求出图片的长宽
threshold=graythresh(i)%设立二值图像的阈值
bw=im2bw(i,threshold)%转换成二值图像
bw2=bwperim(bw,8)%按八连通求出图片的边缘
bw2=bwareaopen(bw2,10)%去除小于10个像素的单元 等于是排除了杂质
subplot(232)
imshow(bw2)
title('去除杂质后的二值图像')
%此处是为了避免出现右图所示的情况,先膨胀再填充 可保证气泡填满,最后进行腐蚀得到最终准确结果。
s
3、e=strel('disk',5)%设定半径为5的结构元素
bw3=imdilate(bw2,se)%先进行膨胀处理
subplot(233)
imshow(bw3)
title('膨胀处理后的二值图像')
bw4=imfill(bw3,'hole')%再进行填充处理
subplot(234)
imshow(bw4)
title('填充处理后的二值图像')
bw=imerode(bw4,se)%最后进行腐蚀处理,得到了气泡准确的二值图像
subplot(235)
imshow(bw)
title('腐蚀处理后准确的二值图像')
a=sum(bw(:))./(m*
4、n) %通过计算二值图像像素值和与图像像素个数总和得到比例
c=0%设定初始的气泡个数
for counter=3:100%设定循环,从半径为3开始的形状元素
se2=strel('disk',counter)
bw=imerode(bw,se2)%腐蚀操作,尽量还原出重叠部分的气泡
[b,l]=bwboundaries(bw,'noholes')%l返回的是标签矩阵,
if max(l(:))>=c %对每次求出l中的最大元素值,即气泡的个数。
c=max(l(:))
else
return
5、 end
subplot(236)
imshow(label2rgb(l,@jet,[0.5 0.5 0.5]))
title('腐蚀到阈值时形成的图像')
end
这样就求出了占面积比为0.3868,个数为10个(实际上是13个)
四:存在的问题
1:运算不够快,共花费了15秒左右的时间,矩阵运算量比较大,还有针对求气泡个数,没有想到更好的优化算法,如果将counter=3:100更改为counter=3:2:100(即步长拉大) 会有一定的时间提升,并且能够保证准确度。
2:对于气泡重叠部分的处理,理想化的比较多,若重叠部分比较多,或者重叠部分占气泡比比较大时,会存在较大误差。
五:更多例子
1:下图所示:占比0.3512,个数是10(正确是11)
2
2:下图所示 占比是0.0999 个数是43(正确是46)
中间底部最大的气泡填充后依旧有缺口,这是膨胀的结构元素不够大导致的。