图像分析技术

图像分析技术可以返回与图像结构有关的信息。MATLAB中提供了边缘检测、边界跟踪等图像分析方法。[大谦MATLAB,dqmatlab点com]

边缘检测

用edge函数可以进行边缘检测。这里的边缘指的是图像中对象的边界。为了进行边缘检测,edge函数使用下面两个准则中的一种,在图像上查找亮度发生明显改变的地方:

亮度的一阶导数在量级上比某些阈值更大的地方;

亮度的二阶导数为0的地方。

edge函数提供了多个求导器,每个求导器可以解决上面问题中的一种。对于某些求导器,可以指定操作是否对水平边界、垂直边界或两者都敏感。edge函数可以返回一个二值图像,图像中找到了边界的像素用1表示,否则用0表示。

在edge函数提供的边缘检测方法中,最有力的是Canny法。该方法与其他边缘检测方法的主要区别在于,它使用两个阈值来检测强边界和弱边界,并且只在弱边界与强边界相连时才进行显示。所以,该方法与其他方法相比,受噪声影响的机会更小,并且更有可能找到真实的弱边界。

比较Sobel边缘检测器和Canny边缘检测器在同一个图像上的应用效果。

(1)读入图像并显示。

(1)读入图像并显示。

code.matlab
>> I=imread('Bird.bmp');
>> I2=im2bw(I);
>> imshow(I2)

显示效果如图4-8所示。

(2)对图像应用Sobel和Canny边缘检测器并显示结果。

code.matlab
>> BW1=edge(I2,'sobel');
>> BW2=edge(I2,'canny');
>> imshow(BW1)
>> figure, imshow(BW2)

生成图4-9和图4-10所示的图像。

Document Image Document Image

图4-9 应用Sobel边缘检测器的效果 图4-10 应用Canny边缘检测器的效果

边界跟踪

MATLAB的图像工具箱中提供了两个函数:bwtraceboundary函数和bwboundaries函数,可以利用它们查找二值图像中的对象边界。

bwtraceboundary函数返回图像中对象边界上所有像素的行坐标和列坐标,必须指定对象上一个边界像素的位置作为跟踪的起点。bwboundaries函数返回图像中所有对象边界像素的行坐标和列坐标。

对于这两个函数,非0像素属于对象,值为0的像素组成背景。

使用bwtraceboundary函数跟踪二值图像中的对象边界,然后用bwboundaries函数获取图像中所有对象的边界像素坐标。

(1)读入图像并显示它。

code.matlab
>> I=imread('coins.png');
>> imshow(I)

生成图4-11所示的图像。

(2)将图像转换为二值图像。bwtraceboundary函数和bwboundaries函数都只用于二值图像。

code.matlab
>> BW=im2bw(I);
>> imtool(BW)

生成图4-12所示的图像。

Document Image Document Image

图4-11 原图像 图4-12 转换为二值图像

(3)确定要跟踪的对象边界上一个像素的行坐标和列坐标。bwboundaries函数把该点作为边界跟踪的起点。

code.matlab
>> dim=size(BW)
>> col=round(dim(2)/2)-90;
>> row=min(find(BW(:,col)))

(4)调用bwtraceboundary函数,从指定点开始跟踪边界。作为必需的变量,必须指定一个二值图像、起点的行坐标和列坐标,以及第1步的方向。本例中将北作为第1步的方向。

code.matlab
>> boundary=bwtraceboundary(BW,[row, col],'N');

(5)显示原始灰度图像,然后利用bwtraceboundary函数返回的坐标显示边界。

code.matlab
>> imshow(I)
>> hold on;
>> plot(boundary(:,2),boundary(:,1),'g','LineWidth',2);
生成图4-13所示的图像。

生成图4-13所示的图像。

图4-13 带有跟踪边界的图像

(6)调用bwboundaries函数跟踪图像中所有硬币的边界。在默认情况下,bwboundaries函数可以查找图像中所有对象的边界,包括位于其他对象内部的对象。在本例使用的二值图像中,有些硬币包含黑色的区域,bwboundaries函数将它们当作单独的对象。为了确保bwboundaries函数只返回这10个硬币的边界,本例指定“noholes”变量。

code.matlab
>> boundaries=bwboundaries(filled,'noholes');

(7)正如下面输出所显示的,bwboundaries函数返回图像中所有硬币边缘像素的坐标值。

code.matlab
whos boundaries
  Name      Size                   Bytes  Class
boundaries  10x1                    24 936  cell array

对于某些对象,在选择起点和方向时必须要小心。例如,如果对象包含洞并且起点位于对象的狭长部分,根据第1步选择的方向的不同,则可能会跟踪到对象边界以外或者洞边界的内部。对于填充了的对象,第1步选择的方向没有这么重要。