【问题标题】:Extracting Shapes that meet a certain criteria from an Image从图像中提取满足特定条件的形状
【发布时间】:2016-02-12 16:46:09
【问题描述】:

假设我有一张图像,我想从中提取某些形状。这张图片有很多形状,但我只关心用对角线填充的形状。这样的图像可能如下所示:

由于我只关心其中有对角线的形状,因此我尝试使用此图像来生成如下所示的形状:

目前,我正在尝试使用卷积来做到这一点。 我首先将图像与此矩阵进行卷积: ]

这会产生如下所示的图像: 这在提取我正在寻找的信息方面做得相当好,但现在我想让它看起来像我理想的最终图像。

我当前流程的下一步是对图像进行模糊处理,在对图像进行模糊处理后,我使用阈值来获得如下所示的结果。

这非常接近我想要的,但我有点卡住了。 你们知道解决这个问题的更好方法吗?最终目标是编写一个软件,该软件将获取具有此类特征的任何图像,并以这种方式提取它们。

感谢您的宝贵时间!

【问题讨论】:

    标签: image-processing computer-vision image-manipulation feature-extraction gimp


    【解决方案1】:

    很好的问题。我将直接从命令行尝试使用 ImageMagick - 它已安装在大多数 Linux 发行版上,并且可用于 OSX 和 Windows。它具有 C++、C#、.Net、Python、Perl、PHP 等的绑定。

    我会选择 Hit and Miss 风格的形态学,其对角线内核如下:

    convert tetris.png -negate     \
       -morphology hit-and-miss "3x3: 1,0,0 0,1,0 0,0,1" result.png
    

    一旦你有了它,你可能需要一种方法来定位对角线阴影区域。一种方法是将所有像素“squidge” 放入一个像素宽的列中 - 想象一下同时压入两侧,直到图片只是一个细列。你也可以垂直做同样的事情——想象在图像顶部放置一个重物,直到它压扁到只有一个像素高。像这样:

    convert tetris.png -negate -morphology hit-and-miss "3x3: 1,0,0 0,1,0 0,0,1" -resize 1x2200! -scale 25x2200! -normalize tall.png
    
    convert tetris.png -negate -morphology hit-and-miss "3x3: 1,0,0 0,1,0 0,0,1" -resize 3400x1! -scale 3400x25! -normalize wide.png
    

    上面的最后一个-scale 只是为了让它足够宽以至于可以看到——你真的不需要那个。

    然后您可以要求以文本格式输出,并查找颜色从黑色变为灰色或白色阴影的位置,这就是形状边缘的坐标。像这样:

    convert tetris.png -negate -morphology hit-and-miss "3x3: 1,0,0 0,1,0 0,0,1" -resize 1x2199! -normalize -alpha off -depth 8 txt:
    
    # ImageMagick pixel enumeration: 1,2199,255,gray
    0,0: (0,0,0)  #000000  gray(0)
    0,1: (0,0,0)  #000000  gray(0)
    0,2: (0,0,0)  #000000  gray(0)
    0,3: (0,0,0)  #000000  gray(0)
    0,4: (0,0,0)  #000000  gray(0)
    ...
    ...
    0,184: (0,0,0)  #000000  gray(0)
    0,185: (0,0,0)  #000000  gray(0)
    0,186: (0,0,0)  #000000  gray(0)
    0,187: (257,257,257)  #010101  gray(1)
    0,188: (3855,3855,3855)  #0F0F0F  gray(15)   <= Transition from black = start of shape
    0,189: (3855,3855,3855)  #0F0F0F  gray(15)
    0,190: (3855,3855,3855)  #0F0F0F  gray(15)
    0,191: (3855,3855,3855)  #0F0F0F  gray(15)
    0,192: (3855,3855,3855)  #0F0F0F  gray(15)
    0,193: (3855,3855,3855)  #0F0F0F  gray(15)
    0,194: (3855,3855,3855)  #0F0F0F  gray(15)
    0,195: (3855,3855,3855)  #0F0F0F  gray(15)
    0,196: (3855,3855,3855)  #0F0F0F  gray(15)
    0,197: (3855,3855,3855)  #0F0F0F  gray(15)
    0,198: (3855,3855,3855)  #0F0F0F  gray(15)
    0,199: (3855,3855,3855)  #0F0F0F  gray(15)
    0,200: (3855,3855,3855)  #0F0F0F  gray(15)
    0,201: (3855,3855,3855)  #0F0F0F  gray(15)
    0,202: (3855,3855,3855)  #0F0F0F  gray(15)
    ...
    ....
    0,324: (3855,3855,3855)  #0F0F0F  gray(15)
    0,325: (3855,3855,3855)  #0F0F0F  gray(15)
    0,326: (3855,3855,3855)  #0F0F0F  gray(15)
    0,327: (4883,4883,4883)  #131313  gray(19)
    0,328: (19789,19789,19789)  #4D4D4D  gray(77)   <= Fatter part of shape
    0,329: (20817,20817,20817)  #515151  gray(81)
    0,330: (20817,20817,20817)  #515151  gray(81)
    0,331: (20817,20817,20817)  #515151  gray(81)
    

    所以你可以看到你的形状从 188 像素开始,到 328 像素的脂肪部分。

    另外,在您的原始图像上进行连接组件分析(也称为Blob 分析),如下所示:

    convert tetris.png                                    \
      -define connected-components:verbose=true           \
      -define connected-components:area-threshold=100000  \
      -connected-components 8 -auto-level output.png
    

    输出

    Objects (id: bounding-box centroid area mean-color):
      0: 3399x2199+0+0 1774.2,1149.3 5390079 srgba(255,255,255,1)
      7: 2045x1180+405+187 1475.1,930.4 1681486 srgba(255,255,255,1)
      40: 546x334+1753+1661 2025.5,1827.5 182364 srgba(255,255,255,1)
      6: 2057x1192+399+181 1580.7,839.8 117980 srgba(0,0,0,1)
      5: 702x146+621+149 971.5,221.5 102492 srgba(255,255,255,1)
    

    如果我在输出第二行的方框里画,你可以看到:

    convert tetris.png -stroke red -fill none -draw "rectangle 405,187 2450,1367" x.png
    

    您可能会查看红色边界框的面积(1681486 像素)和/或其形状(2045x1180),以考虑其比例以及它们是否与您寻找的图案框的形状和大小相匹配,即它的方形程度是或不是。

    【讨论】:

    • 这太棒了!正是我正在寻找的解决方案类型:)
    • 非常好,很高兴它有帮助。 Anthony Thyssen 提供了关于如何在此处使用 ImageMagick 的精彩资源imagemagick.org/Usage 祝您项目顺利,并记住 Stack Overflow 上免费提供新问题。
    【解决方案2】:

    您能否将结果后处理为像素的平均邻域,并设置一个阈值,将邻域中的所有像素分配为黑色或白色?通过使用大小为边缘“锯齿”伪影周期的方形邻域,您将通过填充“谷”并消除“峰”来平滑边缘。

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多