数字图像处理课后作业答案 计算气泡

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Problem 11.24

所提的解决方案的核心关键是能够检测出不同大小的气泡。我们在这里假定所有气泡都是圆的。提出的解决方案有以下五个部分构成:

1)图像分割;2)后处理;3)气泡检索,确定与边缘融合的气泡;4)形状检测;5)计算气泡的面积占图像总面积的比例;

1)分割图像:

我们假定书上所给的图片能够代表实际系统当中出现的大部分图像。所给出的图像能够通过全局阈值进行分割。从图像的直方图(图1)我们可以清楚得到我们感兴趣的区域的主要集中在直方图灰度级高的一侧。我们使用自动阈值分割算法,m代表均值,σ代表方差,则阈值定为m+2σ。在所给定的图像中我们计算出来的阈值为195.分割的结果如图2所示,当然这只是一个比较通用的分割方法。

图1 图2

2)后处理:

从分割后的图像可以见到,气泡当中还有很多的黑色区域,这很有可能是由于反光或者气泡本身中空引起的。我们可以尝试对气泡进行修复或者填满气泡,但是使用形态学的操作必然会导致很多计算上的耗费,由于对精度没有一个具体

的要求标准,这里我们就只对气泡做了简单的闭运算,效果如图3 所示,后续可以根据实际系统所需要的精度来确定所需的形态学操作,在后面的面积比例计算当中我们也忽略不完整气泡所带来的面积误差。

图3

3)气泡的查找

由图中我们可以清楚的知道气泡可以分为三类,一类是与边界有交集的气泡,一类是单独存在的气泡,最后是彼此交叠在一起的气泡。首先对于与边界有交集的气泡,我们通过检测边界找到白色的像素点(白色代表气泡区域),然后通过联通区域查找获得与边界融合的气泡。其次去掉与边界融合的气泡的影响,对于彼此重叠的气泡和单个气泡可以通过气泡的面积来区分(或者形状),在有大量图像的基础下我们可以获得每个气泡的合理面积范围,以此来判断是否重叠。4)形状检测

使用霍夫变化进行椭圆检测(气泡在上升的过程当中其实更多是呈椭圆形状)设定霍夫变换的阈值可以将单独的气泡检测出来。具体的阈值与实际要求的精度

和大多数图片的检测效果来实际尝试后确定

5)可分辨气泡数目的计算

除去与边界融合的气泡,计算单独的气泡和交叠在一起的气泡的总数目就可得到可分辨气泡的数目。

6)气泡占总面积的比率

这个比率就等于后处理后图中所有白色像素点的个数除以总的像素点的个数。所给的样本例子中气泡面积占总面积的比例大约为7.7172%

最后对于最小可检测的物理尺寸,如果我们在4当中将只有一个像素点的联通区域也算是一个气泡的话,那么对于7cm的700X700图像而言,最小的物理尺寸为10mm。

附原图和简易方案的matlab代码

clc

clear

I=imread('534286416955055193.jpg'); %读取原始图像

warning off

imshow(I,[]);title('原始图像'); %显示原始图像

figure

imhist(I);title('直方图图像');

I1=zeros(size(I,1),size(I,2)); %初始化一个与原图一样大小的矩阵

for i=1:size(I,1) %这两个for循环是进行全局的阈值分割for j=1:size(I,2)

if I(i,j)>230

I1(i,j)=1;

end

end

end

figure

imshow(I1);title('二值图像');

B=ones(25,25); %初始化形态学操作的‘单元’

figure

I2=I1;

th=7; %做七次的闭操作

for i=1:th %for循环,闭操作,先腐蚀后膨胀I2=imdilate(I2,B);

I2=imerode(I2,B);

end

imshow(I2);title('闭运算图像');

[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); % 去掉和边缘连接的点

figure

imshow(bw2);title('最终图像');

L1 = bwlabel(bw2,8); %计算最终图像连通区域

S1 = regionprops(L1, 'Area');

NUM=size(S1,1); %计算出泡泡的个数

disp(['有',num2str(NUM),'个泡泡']);

Welcome To Download !!!

欢迎您的下载,资料仅供参考!

相关文档
最新文档