删除未连接到二进制图像中的中心对象的对象

时间:2015-06-08 05:14:05

标签: image matlab image-processing image-manipulation object-detection

我有一个包含一些对象的二进制图像。这些物体的形状是不规则的。

http://s2.img7.ir/tQ69Q.jpg

此图像中心的对象对我很重要。如何删除未连接到中心对象的所有对象?期望的结果应如下所示:

http://s2.img7.ir/8XCxR.jpg

2 个答案:

答案 0 :(得分:2)

如果您有图像处理工具箱,只需调用bwareaopen即可。基本上,您过滤掉那些低于某个区域阈值的区域。我选择700像素的阈值,我设法得到中心区域。这与中心区域是图像中最大区域的事实相结合。首先,我直接从StackOverflow读取您的图像,并将您的图像转换为二进制,因为它最初是灰度级的。接下来,我使用700像素的阈值调用bwareaopen,然后显示图像:

im = im2bw(imread('http://s2.img7.ir/tQ69Q.jpg'));
out = bwareaopen(im, 700);
imshow(out);

我们得到:

enter image description here

或者,您可以使用regionprops并处理Area字段,并确定哪个对象是图像中的最大对象。从那里,您可以简单地创建一个新图像,并使用PixelIdxList字段来确定属于最大对象的像素位置(以列为主)并在输出图像中设置正确的位置。

这样的事情:

im = im2bw(imread('http://s2.img7.ir/tQ69Q.jpg'));
s = regionprops(im, 'Area', 'PixelIdxList'); 
[~,maxID] = max([s.Area]);
pix = s(maxID);
out = false(size(im));
out(pix.PixelIdxList) = true;
imshow(out);

我们应该像以前一样得到同样的东西。然而,缺点是总体上只提取一个对象。你可以调整上面的代码来搜索超过特定阈值区域的对象,但是你基本上都在做bwareaopen,所以坚持使用那种方法。

答案 1 :(得分:0)

如果没有img-toolbox,你可以做的一件简单事就是将种子放在中间。然后步骤1向右,向左,向上,向下并重复每个网格点的值。你必须以某种方式做到这一点,这样在到达黑色区域后,其他所有东西都变为0,而与种子相关的一切都保持为1。

我猜您的照片定义为p(n rows,m cols) = [ 0 0 0 1 0 1; 0 1 0 0 1; ...]。 我的意思是以下内容: 从中间[x,y] = [n/2, m/2]开始,或者想要“保留”装饰品。

for k = 1:n/2-1
  for i = 1:m/2-1
    p(x+k,y+j) = p(x+k,y+j)*p(x+k-1,y+j-1);
  end
end
.. repeat with the other 1/2 of the picture

通过将值与其邻居相乘,您首先得到1 * 1。在达到第一个0之后,一切都将乘以0,...所以剩下的就是连接的内部部分。 我没有看到,如果我的指数在这里是正确的,那我就把它留给你试试(如果你需要-1或+1,那么你的形状不会改变)。