如何找到二值图像中对象的周长?
How do I find the perimeter of objects in a binary image?
我目前正在使用 bwperim
函数,如下所示:
BW2 = bwperim(BW);
BW
是输入二值图像,BW2
是另一个二值图像,显示 BW
中所有不同二值对象的周长。但是,我不太确定 bwperim
是如何工作的,所以我想实现一个算法来执行 bwperim
所做的事情而不使用函数本身。
因此,bwperim
如何找到二值图像中物体的周长?是否有已知算法可以执行此操作?
查找图像中二进制对象周长的最简单技术之一是使用非常小的结构元素执行 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
进行比较,您会发现我们得到的结果大致相同。
我目前正在使用 bwperim
函数,如下所示:
BW2 = bwperim(BW);
BW
是输入二值图像,BW2
是另一个二值图像,显示 BW
中所有不同二值对象的周长。但是,我不太确定 bwperim
是如何工作的,所以我想实现一个算法来执行 bwperim
所做的事情而不使用函数本身。
因此,bwperim
如何找到二值图像中物体的周长?是否有已知算法可以执行此操作?
查找图像中二进制对象周长的最简单技术之一是使用非常小的结构元素执行 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
进行比较,您会发现我们得到的结果大致相同。