文档库 最新最全的文档下载
当前位置:文档库 › 赵琛 图像分割实验

赵琛 图像分割实验

图像分割实验 121180166 赵琛

一、实验目的

进一步学习各种图像分割算法

二、实验原理

1.图像分割

图像分割是将图像划分成若干个互不相交的小区域的过程, 小区域是某种意义下具有共同属性的像素的连通集合。图像分割有三种不同的途径:区域法、边界法、边缘法。最常用的是灰度阈值化处理进行的图像分割:

(,)(,)255

(,)f x y T g x y f x y T

?

≥??

域值T 的选取直接影响分割的效果! (1)直方图双峰域值选择 (2)迭代域值选择

迭代思想:选择一个初始估计值,通过某种策略不断改进(调制)新的估计值,直到满足给定的准则。 迭代步骤:

⑴选择一个初值估计值T ,一般为最大灰度值和最小灰度值的中间值; ⑵使用域值T 分割图像,得到两组像素G1(>=T)和G2(

⑸重复步骤2~4,直到新域值的改变量小于预先定义的参数e 。 2、边缘检测

灰度或结构等信息的突变出称为边缘,在空间域借助微分算子通过卷积来完成,而空域的微分在离散数字图像可以采用差分来近似。

Reborts 算子

Reboerts 算子是一种利用局部差分来寻找边缘的算子,Roberts 梯度算子所

采用的是对角方向相邻两像素值之差,算子形式如下:

)1,1(),(---=j i f j i f Gx (2.3.3 )1,(),1(---=j i f j i f Gy

(2.3.4 2

2|),(|y x G G y x G +=

(2.3.5)

Roberts 梯度算子对应的卷积模版为:

?

?

????-=1001Gx

?

?

?

???-=0110Gy (2.3.6)

用以上两个卷积算子与图像运算后,可求出图像的梯度幅值 G ( x,y),然后选择 适当的阈值τ ,若 G ( x,y)>τ,则 (i ,j)为边缘点,否则,判断 (i ,j)为非边缘点。由此得到一个二值图像 { g (i,j)},即边缘图像。Roberts 算子采用的是用对角线方向上相邻两像素的差近似梯度幅值来检测边缘,它的定位精度高,对于水平和垂直方向的边缘,检测效果较好,而对于有一定倾角的斜边缘,检测效果则不理想,存在着许多的漏检。另外,在含噪声的情况下,Roberts 算子不能有效的抑制噪声,容易产生一些伪边缘。因此,该算子适合于对低噪声且具有陡峭边缘的图像提取边缘。

3)Sobel 算子

Sobel 算子在边缘检测算子扩大了其模版,在边缘检测的同时尽量削弱了噪声。其模版大小为3×3,其将方向差分运算与局部加权平均相结合来提取边缘。在求取图像梯度之前,先进行加权平均,然后进行未分,加强了对噪声的一致。Sobel 算子所对应的卷积模版为:

??

??

?

?????---=101202`101Gx

??

??

?

?????--=121000121Gy (2.3.7)

图像中的每个像素点和以上水平和垂直两个卷积算子做卷积运算后,再计算得到

梯度幅值 G ( x,y),然后选取适当的阈值τ ,若 G ( x,y)>τ,则 (i ,j)为边缘点,否则,判断 (i ,j)为非边缘点。由此得到一个二值图像 { g (i,j)},即边缘图像。Sobel 算子在空间上比较容易实现,不但产生较好的边缘检测效果,同时,由于其引入了局部平均,使其受噪声的影响也较小。若使用较大的邻域,抗噪性会更好,但也增加了计算量,并且得到的边缘比较粗。在对精度要求不是很高的场合下,Sobel 算子是一种较为常用的边缘检测算法。

4)Prewitt 算子

同 Sobel 算子相似,Prewitt 算子也是一种将方向的差分运算和局部平均相结合的方法,也是取水平和垂直两个卷积核来分别对图像中各个像素点做卷积运算,所不同的是,Sobel 算子是先做加权平均然后再微分,Prewitt 算子是先平均后求微分,其对应的卷积模版为:

??

??

?

?????---=101101`101Gx

??

??

?

?????---=111000111Gy (2.3.8)

图像中的每个像素点和以上水平和垂直两个卷积算子做卷积运算后,再计算得到

梯度幅值 G ( x,y),然后选取适当的阈值τ ,若 G ( x,y)>τ,则 (i ,j)为边缘点,否则,判断 (i ,j)为非边缘点。由此得到一个二值图像 { g (i,j)},即边缘图像。

在此基础上,有人提出了改进的Prewitt 算子,将其扩展到八个方向,依次用这些边缘模板去检测图像,与被检测区域最为相似的样板给出最大值。用这个最大值作为算子的输出值 P[ i ,j],这样就可将边缘像素检测出来。八个方向的 Prewitt 算子模板及其所对应的边缘方向如下所示:

????

??????----111121`111 ????

??????----111121`111

????

??????----111121`111

????

?

?????---111121`111 0°方向

45°方向

90°方向

135°方向

????

?

?????----111121111

????

?

?????----111121111

????

?

?????----111121111 ????

?

?????----111121`111 180°方向

225°方向 270°方向

315°方向

Prewitt 算子通过对图像上的每个像素点的八方向邻域的灰度加权差之和来

进行检测边缘,对噪声有一定抑制作用,抗噪性较好,但由于采用了局部灰度平均,因此容易检测出伪边缘,并且边缘定位精度较低。

5)LOG 算子(高斯拉普拉斯算子) LOG 算子基本思想是:先在一定的范围内做平滑滤波,然后再利用差分算子来检测在相应尺度上的边缘。滤波器的选择要考虑以下两个因素:其一是滤波器在空间上要求平稳,即要求空间位置误差 Δ x 要小;其二是平滑滤波器本身要求是带通滤波器,并且在有限的带通内是平稳的,即要求频域误差 Δω 要小。根据信号处理中的测不准原理, Δx 和 Δ ω是相互矛盾的,而达到测不准下限的滤波器就是高斯滤波器。Marr 和 Hildreth 提出的这种差分算子是各向同性的拉普拉斯二阶差分算子。该边缘检测器的基本特征是: (1) 所用的平滑滤波器是高斯滤波器

(2) 增强步骤采用的是二阶导数(即二维拉普拉斯函数)

(3) 边缘检测的判据是二阶导数过零点并且对应一阶导数的极大值

该方法的特点是先用高斯滤波器与图像进行卷积,既平滑了图像又降低了噪声,使孤立的噪声点和较小的结构组织被滤除。然而由于对图像的平滑会导致边缘的延展,因此只考虑那些具有局部梯度极大值的点作为边缘点,这可以用二阶导数的零交叉来实现。拉普拉斯函数可用作二维二阶导数的近似,因为它是一种标量算子。为了避免检测出非显著的边缘,所以应该选择一阶导数大于某一阈值

的零交叉点来作为边缘点。实际应用中,常用的LOG算子的模版为:

说明,高斯平滑运算不但可以滤除噪声,还会导致图像中的边缘和其它尖锐不连续部分模糊,而模糊程度取决于空间尺度因子σ的大小。σ越大,高斯滤波对噪声的滤除效果越好,但同时也会丢失重要的边缘信息,影响到边缘检测器的性能。如果σ较小,又可能导致平滑作用不完全而留有较多的噪声。因此在实际应用中,要根据情况选择适当的σ。

6)Canny算子

1986年,Canny从边缘检测算子应该满足的三个准则出发,推导出了最优边缘检测算子Canny算子,该算子是目前理论上相对最完善的一种边缘检测算法。Canny提出的评价边缘检测性能优劣的三个准则分别是:

(1)好的信噪比准则。即将非边缘点判为边缘点的概率要低,将边缘点判为非边缘点的概率要低;

(2)好的定位性能准则。即检测出的边缘点要尽可能在实际边缘的中心;

(3)单边缘响应准则。即单一边缘具有唯一响应,单一边缘产生的多个响

应的概率要低,并且对虚假边缘的响应应得到最大抑制。

利用Canny算子检测边缘的土体算法如下:

(1)用式所示的高斯函数h(r)对图像进行平滑滤波,去除图像中的噪声。

(2)在每一点计算出局部梯度和边缘方向,可以利用Sobel算子、Roberts算子等来计算。边缘点定义为梯度方向上其强度局部最大的点。

(3)对梯度进行“非极大值抑制”。在第二步中确定的边缘点会导致梯度幅度图像中出现脊。然后用算法追踪所有脊的顶部,并将所有不在脊的顶部的像素设为零,以便在输出中给出一条细线。

(4)双阐值化和边缘连接。脊像素使用两个闽值Tl和竹做阂值处理,其中Tl

三、实验内容:

3.1关于空域滤波

在进行分割之前,我们要先进行滤波。检测边缘的算子对于噪声或多或少有些敏感,因此现在空域进行滤波。对于滤波,我采用了两种方式,即中值滤波和均值滤波。经过实验,我得出结论,模板大约在7——9中值滤波效果最好。如果模板过小,滤波效果不够;如果模板过大,那么会损害边缘。而对于均值滤波,会产生额外的噪声点,同时使得边界削弱过大,不利于边界检测。

因此以下各种算法,在进行检测前,我全部先经过了模板是7或9的中值滤波,之后才进行。

3.2边缘检测方法:

对于边缘检测,我采用了robert算子、prewitt算子、sobel算子、log算子、canny算子以及自己写的类log算子这些算法,我认为效果最好的是自己写的类

log算子,其次是log算子和zerocross算子。

3.2.1matlab自带算子:

Log算子:

Roberts算子:

Prewitt算子

Canny算子

Zerocross算子

Sobel算子

从以上几个图,我们可以看出,对于本图,robert、prewitt、sobel算子不能完全找到药片边缘;canny算子过于精细,找到了噪声;log算子和zerocross 算子相对比较合适。

代码:

g1=medfilt2(g,[9,9]);

g1=edge(g1,'log');

figure,imshow(g1);

xlabel('log')

对于不同算子,替换算子符号即可。

3.2.2 手写log算子

LOG算子基本思想是:先在一定的范围内做平滑滤波,然后再利用差分算子来检测在相应尺度上的边缘。滤波器的选择要考虑以下两个因素:其一是滤波器在空间上要求平稳,即要求空间位置误差Δ x要小;其二是平滑滤波器本身要求是带通滤波器,并且在有限的带通内是平稳的,即要求频域误差Δω要小。根据信号处理中的测不准原理,Δx 和Δω是相互矛盾的,而达到测不准下限的滤波器就是高斯滤波器。Marr 和 Hildreth 提出的这种差分算子是各向同性的拉普拉斯二阶差分算子。该边缘检测器的基本特征是:(1)所用的平滑滤波器是高斯滤波器

(2)增强步骤采用的是二阶导数(即二维拉普拉斯函数)

(3)边缘检测的判据是二阶导数过零点并且对应一阶导数的极大值

该方法的特点是先用高斯滤波器与图像进行卷积,既平滑了图像又降低了噪声,使孤立的噪声点和较小的结构组织被滤除。然而由于对图像的平滑会导致边缘的延展,因此只考虑那些具有局部梯度极大值的点作为边缘点,这可以用二阶导数的零交叉来实现。拉普拉斯函数可用作二维二阶导数的近似,因为它是一种标量算子。为了避免检测出非显著的边缘,所以应该选择一阶导数大于某一阈值的零交叉点来作为边缘点。实际应用中,常用的LOG算子的模版为:

我将这个算子与图像进行卷积,发现效果和matlab自带的log算子相比各有好处。这个运算得到的结果对于边界检测比较准确,但是会导致边界线更粗;而matlab自带的LoG算子算出来的结果边缘线较细,但是对一些边界检测不到。

对于这种差异,我想可能是matlab内部还在卷积前进行过滤波,使得边界被弱化了。

代码:

H=imread('f:/pills.jpg');

I=rgb2gray(H);

I=medfilt2(I,[5,5]);

a=[0.0027,0.0331,0.069,0.0331,0.0027;0.0331,0.1793,0.0098 ,0.1793,0.0331;0.0690,0.0098,-1.3257,0.0098,0.0690;0.0331 ,0.1793,0.0098,0.1793,0.0331;0.0027,0.0331,0.069,0.0331,0 .0027];

c=conv2(a,I);

figure,imshow(c);

d=[-2,-4,-4,-4,-2;-4,0,8,0,-4;-4,8,24,9,-4;-4,0,8,0,-4;-2 ,-4,-4,-4,-2];

e=conv2(I,d);

figure,imshow(e);

3.2.3 后续处理

在进行完边界选取之后,我还试图进行过其他处理方法的操作。例如形态学操作。我想,对于这个图形的边界不完整但是存在噪声,开运算和闭运算都可能有好处。但结果是这二者都没有显得更好。我在边缘检测之前还试图使用顶帽运算和底帽运算,效果也没有更好。

3.3阈值处理

此处我们选用了两种策略

3.3.1 全局阈值方法

对于全局阈值,我们使用直方图双峰法,将高于某一固定阈值的灰度设为1,低于这一阈值的灰度设为0.好处是简单易行,问题在于一般的图形并不能如此简单的划分,因为并不具有一个很明显的双峰型的直方图。以本图为例,我们可以看到,效果并不好,原因就是从图像直方图来看,这个不适合使用固定阈值来进行区域划分。

直方图

效果图

代码:

H= imread('f:/pills.jpg');

I=rgb2gray(H);

figure, imhist(I)

T=graythresh(I);

Ibw2 = im2bw(I,T);

figure, imshow(Ibw2);

3.3.2动态阈值方法

动态分割的原理见第二部分。

在实际操作中,这类算法的时间和空间复杂度比较大,但抗噪声能力强,对一些用全局阈值不好分割的图像有较好的效果。

我们将这一幅图与全局阈值图像进行对比,可以发现,效果得到了提升,但幅度有限。

代码:

H=imread('f:/pills.jpg');

I=rgb2gray(H);

I=histeq(I);

I=double(I)/255;

k1=(max(max(I))+min(min(I)))/2;

[rows cols]=size(I);

count1=0;

count2=0;

for i=1:rows

for j=1:cols

if I(i,j)

count1=count1+1;

G1(count1).I=I(i,j);

else

count2=count2+1;

G2(count2).I=I(i,j);

end

end

end

k2=(mean(mean([G1.I]))+mean(mean([G2.I])))/2; while(abs(k2-k1)>(5/255))

k1=k2;

count1=0;

count2=0;

for i=1:rows

for j=1:cols

if I(i,j)

count1=count1+1;

G1(count1).I=I(i,j);

else

count2=count2+1;

G2(count2).I=I(i,j);

end

end

end

k2=(mean(mean([G1.I]))+mean(mean([G2.I])))/2; end

figure(1);imshow(I);

figure(2);II=im2bw(I,k2);imshow(II);

四、实验感想

本次实验内容主要是图像分割。图像分割是计算机视觉中最底层的一部分,是进行其他计算机视觉内容的基础。通过本次实验,我对于几种基本的图像分割方法有了一个基本的了解。

相关文档
相关文档 最新文档