从图像中提取符合特定条件的形状

时间:2016-02-12 16:46:09

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

让我们说我有一个我想从中提取某些形状的图像。这个图像有很多形状,但我只关心用对角线填充的形状。这样的图像可能如下所示: Starting Image Example

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

Ideal Final Image Example[2]

目前,我试图通过卷积来做到这一点。 我首先用这个矩阵卷积图像: Convolution Matrix]

生成如下图像: Convolved Image 这在提取我正在寻找的信息方面做得相当不错,但现在我想让它看起来像我理想的最终图像。

我当前流程的下一步是模糊图像,在模糊图像后,我使用阈值来获得看起来像这样的结果。

Image after threshold

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

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

好问题。我将直接从命令行尝试使用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

enter image description here

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

enter image description here

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

enter image description here

您可以查看红色边框(1681486像素)和/或其形状(2045x1180)的区域,以考虑其比例以及它们是否与您所寻找的图案框的形状和大小相匹配,即它是如何方形的是或不是。

答案 1 :(得分:0)

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