如果这篇文章帮到了你,别忘了给个赞!
网上关于imclearborder函数的算法原理实在太少,这篇博客对这个函数做一个大致的解释。
简单说,这个函数的作用就是:把与图像边界相连接的像素全部清除。
这里的图像边界,并不是指图像里面物体和背景的边界,而是指实实在在的图像显示的边界。
举个例子:
假如图像是30 X 40 像素,那么图像边界就是指:[1, :](第一行),[30, :](最后一行),[:, 1](第一列),[:, 40](最后一列)这些像素的位置。
这个算法的操作就是,把与这4条边相连的 像素区域 全部清除。
实验如下:
BW = [0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0
0 1 0 0 0 0 0 1 0
0 1 0 1 1 1 0 1 0
1 1 0 1 1 1 0 1 0
0 1 0 1 1 1 0 1 0
0 1 0 0 0 0 0 1 0
0 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0];
BW1 = imclearborder(BW,8);
disp(BW1)
结果如下:
>> DRAFT2
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
可以看到,由于[5, 1]位置的像素值为1,算法认为这个位置存在像素,且与图像的边界相连,所以执行清除操作(将其像素值改为0)。同时,与[5, 1]相连的像素区域均被清除。
BW = [0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0
0 1 0 0 0 0 0 1 0
0 1 0 1 1 1 0 1 0
0 1 0 1 1 1 0 1 0
0 1 0 1 1 1 0 1 0
0 1 0 0 0 0 0 1 0
0 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0];
BW1 = imclearborder(BW,8);
disp(BW1)
手动将[5, 1]位置的像素改为0,执行结果如下:
>> DRAFT2
0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0
0 1 0 0 0 0 0 1 0
0 1 0 1 1 1 0 1 0
0 1 0 1 1 1 0 1 0
0 1 0 1 1 1 0 1 0
0 1 0 0 0 0 0 1 0
0 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0
可以看到,由于算法没有找到与图像边界相连的像素,所以没有执行清除操作。
函数用法:
BW1 = imclearborder(BW,8);
第一个参数为传入的图像。一般来说,这个参数基本都是二值化后的黑白图像。我没有试过直接用灰度图或者RGB图像作为参数传入。
第二个参数为连接的方向,参数 4 代表按4方向(上下左右)计算连接区域;参数 8 代表按8方向计算连接区域。