我目前正在使用bwperim
函数:
BW2 = bwperim(BW);
BW
是输入二进制图像,BW2
是另一个二进制图像,显示BW
中所有不同二进制对象的周长。但是,我不太确定bwperim
是如何工作的,所以我想实现一种算法来执行bwperim
所做的事情而不使用函数本身。
因此,bwperim
如何在二进制图像中找到对象的周长?有没有已知的算法可以做到这一点?
答案 0 :(得分:2)
在图像中找到二进制对象周长的最简单方法之一是使用非常小的结构元素执行morphological erosion ....通常是3 x 3的正方形。一旦发现侵蚀,您只需使用原始图像和侵蚀结果执行图像减法。
当进行形态侵蚀时,物体的面积会略微减少,周长也会减少。通过使用3 x 3方形结构元素,您将边框像素的周长减少1个像素,因此使用原始结果减去此结果将为您提供对象的周长。
鉴于您的二进制图像存储在BW
中,您只需执行此操作:
se = strel('square', 3);
BWerode = imerode(BW, se);
BWper = logical(abs(imsubtract(BWerode, BW)));
请注意,当我们减去时,可能会出现负差异的情况。我们不希望这样,所以我们采用abs
,然后转回logical
(a.k.a。true / false)。 BWper
包含查找所有对象周长的图像。请注意,如果你有任何小于的物体,而不是3 x 3的方格,那么你就不会得到任何外围的结果......但我假设你不想找到在任何情况下,这些小物体的周长。
这是我的一个示例图像,它包含一堆正方形:
我们可以像这样读到MATLAB,它已经是二进制文件了:
BW = imread('http://i.stack.imgur.com/Jk0o0.png');
运行上述周边查找代码,这是我们得到的图像:
如果将其与bwperim
进行比较,您会发现我们得到的结果大致相同。