在图像处理过程中,追踪图像边界是一种十分基础而且常见的操作。而在MATLAB中,我们可以使用“bwtraceboundary”函数来完成此项任务。下面将为大家介绍如何使用此函数来实现追踪图像边界的操作。
一、函数介绍
“bwtraceboundary”函数是MATLAB中的一个二值图像处理函数,其主要功能是追踪二值图像中的边界。该函数的语法格式为:
[B,L] = bwtraceboundary(BW,xy,start_pos,direction)
其中,“BW”表示输入的二值图像矩阵,“xy”表示在该图像中起点的坐标,即“start_pos”的位置,“direction”表示边界的追踪方向(默认为“cw”,即顺时针方向)。“B”表示边界的坐标(此处数据类型是double),“L”表示边界的长度。
该函数实际上是对C语言中的追踪边界算法的MATLAB实现。而追踪边界算法主要分为两种,即Moore邻域算法和Freeman链码算法。在该函数中,默认采用的是Moore邻域算法。
也就是说,“bwtraceboundary”函数可以追踪一个对象的边界,并把坐标存在一个数组B中,还能得到边界的长度L。
二、追踪边界的实现
在使用该函数之前,需要初始化MATLAB的工作目录,并将需要处理的图像保存在该目录下。当然,在使用该函数之前,用户还需要对于该函数的输入进行合理的处理。
1.读取图像
对于二值图像而言,一般的图片格式(比如JPEG、PNG等)都不直接支持,因此我们需要将图片进行处理,将其转换成二值图像。
bw = imread(‘picture.bmp’);
注:如果图片是单通道灰度图,并且想要得到二值化的图片,可以直接使用图像阈值化函数“im2bw”来实现,语法格式如下:
bw = im2bw(I,th);
其中,“I”表示输入的灰度图像,“th”表示设定的阈值,0<=th<=1。
2.确定起始点
“bwtraceboundary”函数的第三个参数“start_pos”表示的是起始点的坐标位置。在选取起始点时,注意起始点必须在图像的最外层边缘上,而选择的方向决定了边缘追踪的路径是否正确。不过,在默认情况下,该函数采用的是“cw ”即顺时针方向来追踪边缘。
在实现代码中,我们一般会使用鼠标单击进行操作(可视化操作),这里的代码如下。
imshow(bw);
[BW,xi,yi] = roipoly;
x0 = xi(1);y0=yi(1); %获取起始点的坐标
3.追踪边界
在确定好起始点后,我们就可以调用“bwtraceboundary”函数来实现边缘的追踪。同时,在使用该函数时,还可以指定边缘的追踪方向“clockwise”(顺时针)或者“counterclockwise”(逆时针)。
[B,L] = bwtraceboundary(bw,[y0 x0],‘cw’);
一旦执行成功,函数将会返回边界的坐标位置以及边界的封闭程度。
4.绘制边框
在得到边框坐标值之后,为了观察边框的情况,我们需要在原始图片上绘制边框。
imshow(bw);
hold on;
plot(B(:,2),B(:,1), ‘g’, ‘LineWidth’,2);
hold off;
在实现绘制边框的代码中,“hold on”指令的作用是保持坐标轴当前状态,而“hold off”指令的作用是恢复坐标轴到初始状态。另外,绘制出的边框的颜色(‘green’)、线宽度(2)也可以进行调节。
三、完整代码实现
下面是一个完整的使用“bwtraceboundary”函数来追踪二值图像边界的实现代码。
% 读取二值图像
bw = imread('picture.bmp');
% 选取起始点
imshow(bw);
[BW,xi,yi] = roipoly;
x0 = xi(1);
y0 = yi(1);
% 追踪边框
[B,L] = bwtraceboundary(bw, [y0 x0], 'cw');
% 绘制边框
imshow(bw);
hold on;
plot(B(:,2), B(:,1), 'g', 'LineWidth', 2);
hold off;
% 展示边框坐标
B
L
以上的代码就可以实现获取二值化图片中的边界坐标,并且可以在图片上绘制边框,可以方便用户进行数据处理分析。
四、小结
在图像处理中,追踪二值化图像的边界是一个经常被使用的基础操作。而MATLAB中提供的“bwtraceboundary”函数可以实现边界的自动追踪,并且节省了开发人员自己写代码的时间和精力。在实际中,我们可以将其应用在图像分析、目标检测等方面,从而提高程序的自动化程度。