【问题标题】:How to discard non-rectangular closed regions in image in MATLAB?如何在MATLAB中丢弃图像中的非矩形封闭区域?
【发布时间】:2018-01-01 23:07:46
【问题描述】:

我想用这样的图像提取类似矩形的形状(有些可能在一侧有三角形延伸);

我在 MATLAB 中所做的是;

BW=imread('Capture2.JPG');
BW=~im2bw(BW);

SE = strel('rectangle',[1 6]);
BW = ~imclose(BW,SE);
BW2 = imfill(~BW,'holes');

figure
imshow(~BW)

figure
imshow(BW2);

s = regionprops(BW,'BoundingBox','Area','PixelIdxList');
s = s(2:end);
[lab, numberOfClosedRegions] = bwlabel(BW);


figure
imshow(BW)
for i=1:numel(s)
    rec = s(i);
    ratio = rec.BoundingBox(4)/rec.BoundingBox(3);%height/width

%     ratio > 0.3 && ratio < 51.6 && rec.Area > 1100 && rec.Area < 22500
%     if ratio > 0.16

       rectangle('Position',s(i).BoundingBox,'EdgeColor','r','LineWidth',2);
       text(rec.BoundingBox(1),rec.BoundingBox(2),num2str(i),'fontsize',16);
%     end
end

我想出的是;

正如所见,有一些区域作为文本的一部分找到,块内部的形状(索引 = 3)和非块区域(索引 = 11)。我需要丢弃内部区域和非阻塞区域。

另一个问题是,由于区域是由白色区域定义的,我需要获取块的黑色边框,以便我可以捕获块本身,而不是内部的白色区域。我该如何解决这些问题?

我都试过反转图像并使用方法但没有成功。

编辑:代码改进和附加图片

其中一个图像可以是这样的,包括非矩形但感兴趣的对象形状(最左边)。

另一个问题,如果图像不如应有的好,线被认为是开放的,尤其是对角线和 1px 宽的线,这会导致 regionprops 错过它们。

代码改进;

close all;

image=imread('Capture1.JPG');
BW = image;
BW = ~im2bw(BW);


SE = strel('rectangle',[3 6]);
BW = ~imclose(BW,SE); % closes some caps to be closed region

r = regionprops(BW,'PixelIdxList'); 
BW(r(1).PixelIdxList) = 0; %removes outermost white space allowing to connection lines disapear

se = strel('rectangle',[6 1]);
BW = imclose(BW,se);% closes some caps to be closed region
BW = imfill(BW,'holes');

s = regionprops(BW,{'Area', 'ConvexArea', 'BoundingBox','ConvexHull','PixelIdxList'});

%mostly the area and convex area are similar but if convex area is much greater than the area itself it is a complex shape like concave intermediate sections then remove
noidx = [];
for i=1:numel(s)
    rec = s(i);
    if rec.Area*1.5 < rec.ConvexArea 
        BW(rec.PixelIdxList) = 0;
        noidx(end+1)=i;
    end
end

s(noidx)=[];

%没有剩余区域的条件 数字 显示(BW)

for i=1:numel(s)
    rec = s(i);
    ratio = rec.BoundingBox(4)/rec.BoundingBox(3);%height/width    
%     ratio > 0.3 && ratio < 51.6 && rec.Area > 1100 && rec.Area < 22500
%     if ratio > 0.16
        rectangle('Position',s(i).BoundingBox,'EdgeColor','r','LineWidth',2);
        text(rec.BoundingBox(1),rec.BoundingBox(2),num2str(i),'fontsize',16,'color','red');
%     end
end

结果是;

优势是所有剩余区域都是区域,如果兴趣没有例外并且没有区域限制等条件,因为图像大小可以不同因此区域。

但即使这样也不适用于第二张图片。由于块下方的文本(总是如此 -> 第一张图像被清除以上传)并且最左侧块的对角线尖端被视为开放线。

【问题讨论】:

  • 矩形的线条是否可能比噪点更粗?
  • 别想了。这个图像不是我的创作。我需要为此努力。所以它就是这样。 ://
  • 部分解决方案是迭代检查中心是否在另一个框内。
  • 您还可以将矩形扩展 1 个像素,然后检查有多少黑色像素与您的矩形相交。如果 nbr_of_black_pixel 删除矩形。
  • @obchardon:无法获得它的用途。这对我说的是什么 nbr_of_black_pixel

标签: matlab image-processing image-segmentation regions


【解决方案1】:

通过添加两个条件,我得到了一些不错的结果:

  • 矩形需要完全闭合
  • 区域需要大于 x 像素(本例中为 1100)

为了检查矩形是否闭合,我为每个多边形创建了一个索引。这些索引具有与矩形相同的形状。所以如果sum(~BW(index)) == sum(index(:)) 表示多边形是闭合的。

更新后的代码:

warning off

BW=imread('test.jpg');
BW=~im2bw(BW);

SE = strel('rectangle',[1 6]);
BW = ~imclose(BW,SE);
BW2 = imfill(~BW,'holes');


s = regionprops(BW,'BoundingBox','Area','PixelIdxList');
s = s(2:end);
[lab, numberOfClosedRegions] = bwlabel(BW);


figure
imshow(imread('test.jpg'))
inc = 1;
for i=1:numel(s)
    rec = s(i);
    s(i).BoundingBox = floor(s(i).BoundingBox + [-1,-1,2,2]);

    %Creation of the index
    clear ind
    ind = zeros(size(BW));
    y = s(i).BoundingBox(1);
    x = s(i).BoundingBox(2);
    h = s(i).BoundingBox(3);
    w = s(i).BoundingBox(4);
    ind(x:x+w,[y,y+h]) = 1;
    ind([x,x+w],y:y+h) = 1;
    ind = logical(ind);

    if sum(~BW(ind)) == sum(ind(:)) && rec.Area > 1100
       rectangle('Position',s(i).BoundingBox,'EdgeColor','r','LineWidth',1);
       text(rec.BoundingBox(1),rec.BoundingBox(2),num2str(inc),'fontsize',16);
       inc = inc + 1;
    end
end

结果

【讨论】:

  • 这是一个有价值的答案,但不能解决我的问题。我将相应地编辑我的问题。
【解决方案2】:

如何舍弃非矩形区域?好吧,我相信你可以想出一些矩形独有的数学属性。

  • 面积是宽度和高度的乘积。

  • 周长是宽度和高度之和的两倍。

  • 明显有4个矩形角。

我想第一个属性就足够了,如果需要,您可以提出更多规则。

您可以删除不需要的矩形和其他具有最小尺寸限制的小东西,或者检查它们是否被矩形包围。

这应该很简单。

【讨论】:

  • 您指出了非常明显的属性,这些属性绝对正确。它们可以使用。仍然不知道如何丢弃区域(索引 = 11),并且某些形状(此处未显示)具有非矩形但凸起的形状,如矩形尖端的三角形,如书签形状。
  • @freezer 我不明白你想要什么。您描述的形状不是矩形。因此,它们无法满足我提到的约束。单独的面积 = 宽度 * 高度就足以摆脱它们。
  • 你是对的,我可能把问题的标题写错了。但是,我不止一次提到过这种情况。可能也有感兴趣的非矩形形状。要丢弃的部分是连接线之间的区域。可能有很多变化,但我猜它们是非凸区域。
  • @freezer 你有两个选择。 a)您识别所有已知的感兴趣的形状或 b)您删除不需要的形状。我想你必须在某个时候对形状进行分类,所以为什么不现在对它们进行分类并跳过其他任何内容。这些对象是由计算机绘制的,因此它们的几何形状遵循某些规则,您可以使用这些规则进行搜索。如果你的对象之间的区域是唯一的凹面,你当然可以利用这个事实来摆脱它们。
  • 如何识别对象及其位置。我的目标是给出类型位置,最终给出对象的名称,以便我可以在软件中从图像重新创建模型。
猜你喜欢
  • 2021-06-26
  • 2012-02-22
  • 2017-11-10
  • 1970-01-01
  • 2014-09-02
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多