如何识别二进制图像的边界以在matlab中裁剪?

时间:2014-06-03 05:53:03

标签: matlab image-processing

如何识别要在matlab中裁剪的二进制图像的边界? 即。输入二进制图像没有噪音。在白色背景中只有一个黑色物体。

3 个答案:

答案 0 :(得分:1)

您可以在MATLAB中使用edge命令。

E = edge(I);

I将是输入灰度或二进制图像。这将返回仅包含边缘的二进制图像。

这可以提供进一步的帮助:

http://www.mathworks.com/help/images/ref/edge.html

答案 1 :(得分:0)

如果您的图片只是黑白且只有一个对象,您可以使用Flood fill算法,Matlab内置支持该算法!

尝试使用imfill功能(ref)。

这应该为您提供对象的范围,这将允许您随意裁剪。

答案 2 :(得分:0)

您也可以反转图像,然后执行regionprops以提取单独对象的所有属性。您需要将图像反转为regionprops,假设对象为白色,而背景为黑色。这种方法的一个好处是它可以推广多个对象,你只需要几行代码即可。

举个例子,让我们在你建议的白色背景上人工创建一个黑色图像中心的圆圈。我们假设这也是一个二进制图像。

im = true(200, 200);
[X,Y] = meshgrid(1:200, 1:200);
ind = (X-100).^2 + (Y-100).^2 <= 1000;
im(ind) = false;
imshow(im);

这就是你的圈子的样子:

enter image description here

现在让我们继续并将其反转,使其成为黑色背景上的白色圆圈:

imInvert = ~im;
imshow(imInvert);

这就是你的倒圆圈的样子:

enter image description here

现在,调用regionprops来查找图像中所有对象的属性。在这种情况下,应该只有一个。

s = regionProps(imInvert, 'BoundingBox');

因此,s包含一个长度为1个元素的结构,并且具有一个名为BoundingBox的字段。该字段是一个4元素数组,其结构如下:

[x y w h]

x表示列/垂直坐标,而y表示边界框的左上角的行/水平坐标。 w,h是矩形的宽度和高度。我们上面代码的输出是:

s = 

BoundingBox: [68.5000 68.5000 63 63]

这意味着我们的边界框的左上角位于(x,y) = (68.5,68.5),宽度和高度各为63。因此,我们的边界框的范围来自行(68.5,131.5)和列(68.5,131.5)。为了确保我们有正确的边界框,您可以使用矩形命令在我们的形状周围绘制一个矩形。

imshow(im);
rectangle('Position', s.BoundingBox);

这是您的图像在对象周围绘制的矩形的样子。如您所见,regionprops给出的边界框是完全封装对象所需的最小跨越边界框。

enter image description here

如果您想裁剪对象,可以执行以下操作:

 imCrop = imcrop(imInvert, s.BoundingBox);

这应该为您提供由我们之前讨论的边界框定义的裁剪图像。

希望这就是你要找的东西。祝你好运!