Advertisement

基于距离变换和分水岭算法的图像分割

阅读量:

1 原始代码【matlab】

复制代码
 i=handles.noise_img;

    
  
    
 if isrgb(i)
    
  
    
 a=handles.noise_img(:,:,1);
    
  
    
 b=handles.noise_img(:,:,2);
    
  
    
 c=handles.noise_img(:,:,3);
    
  
    
 k(:,:,1)=wiener2(a,[5,5]);
    
  
    
 k(:,:,2)=wiener2(b,[5,5]);
    
  
    
 k(:,:,3)=wiener2(c,[5,5]);
    
  
    
 imshow(k);

2.1 图像增强
针对现场生产环境复杂、生产车间内存在各种干扰的问题,在分析图像前,必须对获取的图像进行预处理,截取ROI区域,提高图像的质量,使其更适于后续算法的分析和处理。本文首先截取图像的ROI区域,针对图片明暗分布不均、图像细微处对比度低的问题,采用对比度受限的自适应直方图均衡化方法(CLAHE)[5]对图像进行增强。传统直方图均衡化是在图像全局增强对比度,它对数据的处理不加选择,由于本系统采集的图像常会出现部分区域对比度较好,部分较差,CLAHE算法更适用于对比度不均的情况,CLAHE在增强对比度的同时能抑制图像的噪声,可以更好地突出图像的细节,以下为算法具体流程:
(1)图像分割:将ROI区域分成M行N列的图块,分割数量根据图像特点而定,假设每个图块区域大小为(a,b)。
(2)计算灰度阈值:计算每个图块的直方图,将直方图的灰度级标记为r,可能出现的灰度级个数为K,每个图块直方图函数为Hm,n(r),0≤r≤K-1。通过以下方法得到灰度阈值β。
(1)
式中,参数为α为截止系数,是我们每个灰度级所允许一个像素的最大程度百分比。
(3)均衡处理:对每个图块进行常规的直方图均衡化处理。
(4)插值运算:为了避免图像呈现块状效应,使用双线性插值法对图像进行插值运算,合并相邻图块,以消除人工形成的边界。
采用CLAHE方法对ROI区域进行处理,处理结果如图2所示,原图图像和利用直方图均衡化处理后的图像分别如图3和图4所示,通过CLAHE处理后图像质量有明显改善,与普通的直方图均衡化方法相比,提高了局部对比度,让图像细节更加清晰,也更有利于后期对图像分割。
2.2 钢球检测
图像通过CLAHE处理后,需要对图中钢球进行计数,为了达到较好的效果,本文采用了两种方案进行对比识别,分别为基于距离变换的分水岭图像分割和基于阈值的图像分割。
2.2.1 基于距离变换的分水岭图像分割
方案一采用基于距离变换的分水岭图像分割。距离变换描述了图像中某像素点与某块区域之间的距离大小,它可以将二值图像转化为距离图像,即灰度图像,常用于粘连物体的分离、骨架提取、目标细化等。距离变换的算法分为欧式距离和非欧式距离,欧式距离精度高但计算复杂,时间复杂度高,非欧式距离计算简单,但不易满足精度要求,本系统对时间复杂度要求不高,故采用欧式距离,将ρ定义为点(i,j)与(k,l)之间的欧氏距离,公式为:
(2)
分水岭算法,又称模拟浸水法,分水岭分割所采用的原理主要有两种,模拟降水过程和模拟浸水过程。其基本思想是把图像看成是测地学的拓扑地形图,地形中存在“山峰”和“山谷”,地势低的区域为盆地,地势高的为做山脊,无论是通过模拟浸没法还是模拟降水法,最终都会将盆地区域覆盖,被覆盖的区域即为分割出的图像区域,从而实现了图像分割的目的。

复制代码
 axes(handles.axes2);

    
  
    
 x=(handles.img);
    
  
    
 if isrgb(x)
    
  
    
 msgbox('这是彩色图像,不能通过高通滤波器','失败');
    
  
    
 else
    
  
    
 y1=imnoise(x,'gaussian'); %加高斯噪声
    
  
    
 f=double(y1); % 数据类型转换
    
  
    
 k=fft2(f); % 傅立叶变换
    
  
    
 g=fftshift(k); % 转换数据矩阵
    
  
    
 [M,N]=size(g);
    
  
    
 nn=2;
    
  
    
 d0=3; %截止频率为3
    
  
    
 m=fix(M/2); n=fix(N/2);
    
  
    
 for i=1:M
    
  
    
 for j=1:N
    
  
    
 d=sqrt((i-m)^2+(j-n)^2); % 计算高通滤波器传递函数
    
  
    
 if d<=d0
    
  
    
 h=0;
    
  
    
 else h=1;
    
  
    
 end
    
  
    
 result(i,j)=h*g(i,j);
    
  
    
 end
    
  
    
 end
    
  
    
 result=ifftshift(result);
    
  
    
 y2=ifft2(result);
    
  
    
 y3=uint8(real(y2));
    
  
    
 imshow(y3);
    
  
    
 end

算法流程为:
(1)基于重建的开闭操作:运用数学形态学的基于开和基于闭的重建运算对图像进行分析重建,去除小的“突刺”,填充洞孔,在不影响对象全局形状的同时去除细节和噪声,得到前景和背景标记。
(2)标记前景物体:对重建后的图像在每个对象的内部创建单位极大值。
(3)计算背景标记:通过二值化操作,将背景置为黑色,计算二值图像的欧几里得矩阵,如图5所示,再进行分水岭变换,取出相邻区域间的分界线构成背景标记,如图6所示。
(4)计算分割函数的分水岭变换:结合前景和背景标记,修改梯度幅度图像,让区域最小值出现在标记上,最后进行基于分水岭的分割。
(5)可视化输出:将分割对象边界、前景标记、背景标记叠加到增强后的图像上,如图7所示,统计轮廓个数,对轮廓大小、周长等参数进行限定,即为钢球数目。
2.2.2 基于阈值分割的图像分割
方案二采用基于阈值分割的图像处理,它是最常用的图像分割措施之一。钢球生产环境复杂,在不同的工作时间采集的图像光照分布不同,使用全局阈值很难为图像确定最佳阈值,最大类间方差法(Otsu算法)根据图像的最小类内方差确定最佳全局阈值,但在图像局部过曝或欠曝时,会出现无法正确分离出钢球的情况。因此本文采用局部自适应阈值算法对图像进行二值化,能够更多地分割出前景目标,再根据面积大小和长短轴大小进行滤波,便能够较好地分离出前景钢球。
局部自適应阈值法,该算法对每一个像素点的阈值是不一样的,与Otsu算法和普通的阈值方法相比计算量较大,可以更好地解决光线分布不均匀的问题。该算法的主要步骤为以目标像素点为中心选取一块面积为w×h的区域,使用均值算法对图块里面的像素点计算,如果当前所遍历像素的值比平均值低t%,则把当前值为0,否则为255。本文w和h分别选取图像长宽的1/8,t取35。局部自适应阈值法将一个像素与周围像素平均值进行比较,通过设置局部范围内的硬性条件来减小图像整体光照变化的影响,能够较好地分离出前景目标。
阈值分割算法流程为:
(1)自适应二值化:使用局部自适应阈值对图像进行二值化,通过像素局部均值强度计算每个像素的阈值,系统选取局部区域约为图像大小的1/8,敏感因子为0.35。
(2)孔洞填充:二值化后有许多微小的孔洞,使用以下过程对孔洞进行填充。
(3)
式中,B为填充所用的结构元素,Ac为集合A的补集,填充从全黑图像X0开始迭代,至Xk=Xk-1结束。
(3)形态学开操作:先腐蚀运算,再膨胀运算,去除比掩膜小的前景对象,本文选用半径为8的圆盘形状的掩膜。以下为开运算公式:

(4)
式中,X为被处理图像,B为结构元素,-表示腐蚀操作运算符,+表示膨胀操作运算符。
(4)筛选滤波:根据处理后连通分量的面积、长轴长度和短轴长度进行滤波,统计最终的连通分量个数,即为钢球数目。面积通过统计连通分量边界内部像素点为1的像素个数,长轴和短轴则通过计算连通分量的最小外界矩形得到。
(5)可视化输出:将滤波后的掩膜合成为3通道的BGR图,叠加至原图上,如图7所示。
3 实验结果与分析
在Visual Studio平台下利用C#编写人机交互界面,方便对于钢球计数实验的进行以及在实际场景中的应用,整个交互系统可以选择对导入的图片进行计数,以及自动识别计数,另外也可以分别使用两种方式来实现钢球计数。
在实验过程中为验证钢球计数的准确性,使用两种方式针对不同的钢球数量进行多次检测,具体运行效果如图8所示,部分结果如表1所示。从统计结果来看:方案一误差较大,分析原因为篮底反光、部分钢球位置原因,造成图像部分亮度分部不均,采用分水岭分割易出现过分割和欠分割现象,不正确分割会直接导致计数错误。方案二误差较小,计数错误的原因为钢球数量较少时,篮底有大面积反光的情况,造成对图像的误分割,钢球数量较多时,钢球堆叠遮挡造成部分前景钢球被滤除。

全部评论 (0)

还没有任何评论哟~