图像处理删除线条

时间:2017-01-12 17:41:00

标签: image image-processing imagemagick

我试图最终得到一个只有文字的图像。我的代码将此图像作为灰度,并删除它的所有长行以及除文本/符号/测量之外的所有内容。

enter image description here  这是可以使用图像处理技术完成的吗?我已经开始查看imagemagick库以及其他一些删除行的解决方案

1 个答案:

答案 0 :(得分:6)

我有一些想法,我可能会进一步发展其中一些,或者可能不会![/ p>

<强> 1。使用颜色

该图看起来像是从某个包中生成的,包括Ghostscript,而不是从纸上扫描它,所以我认为你可以控制它的生成。如果是这样,最简单和最干净的选项可能是在Postscript中插入一个命令来改变所有文本的颜色,或者改变所有行和圆的颜色,然后你就可以使用颜色来提取文本。

<强> 2。使用过滤器

您可以使用长水平探测元素和中位数来确定水平线,使用长垂直探测元素来移除垂直线。显然,你可以调整长度等,但这看起来像这样:

convert drawing.png                                              \
  \( -clone 0 -threshold 50% -negate -statistic median 200x1 \)  \
 -compose lighten -composite                                     \
  \( -clone 0 -threshold 50% -negate -statistic median 1x200 \)  \
 -composite result.png

我尝试用200作为长度:

enter image description here

并且长度为500:

enter image description here

第3。使用连接组件分析或Blob分析

想法是找到图像中的所有斑点,然后移除大于您希望保留的字母大小的斑点。我提取了一部分图像以使用这种方法:

enter image description here

convert extract.png -colorspace gray -negate -threshold 50% \
   -define connected-components:verbose=true                \
   -connected-components 8 -auto-level output.png 

<强>输出

Objects (id: bounding-box centroid area mean-color):
  2: 943x660+77+0 553.0,296.5 536272 srgb(0,0,0)
  0: 73x660+0+0 36.0,329.3 48150 srgb(0,0,0)
  10: 279x176+376+484 507.5,582.9 42374 srgb(0,0,0)
  8: 167x99+488+413 574.9,458.8 8939 srgb(0,0,0)
  5: 291x253+370+407 517.6,486.0 8121 srgb(255,255,255)
  7: 166x83+397+413 477.3,450.4 7479 srgb(0,0,0)
  9: 77x90+578+436 628.7,491.1 3511 srgb(0,0,0)
  6: 81x67+376+413 403.5,438.0 3197 srgb(0,0,0)
  1: 4x660+73+0 74.5,329.5 2640 srgb(255,255,255)
  3: 221x154+124+328 213.8,440.1 2225 srgb(255,255,255)
  4: 198x154+686+378 798.3,488.4 2133 srgb(255,255,255)
  11: 38x59+136+559 154.5,588.1 1094 srgb(255,255,255)
  12: 37x59+790+559 808.0,588.0 955 srgb(255,255,255)
  13: 37x59+837+559 855.0,588.0 955 srgb(255,255,255)
  15: 37x58+230+560 248.6,588.2 888 srgb(255,255,255)
  16: 37x58+742+560 760.6,588.2 888 srgb(255,255,255)
  14: 39x58+180+560 201.5,587.8 862 srgb(255,255,255)   <--- Let's look at this one
  19: 23x45+844+566 855.0,588.0 848 srgb(0,0,0)
  18: 23x45+797+566 808.0,588.0 848 srgb(0,0,0)
  20: 24x22+143+589 154.5,599.5 420 srgb(0,0,0)
  17: 18x16+146+566 154.5,573.6 227 srgb(0,0,0)
  21: 8x11+114+606 117.5,611.0 72 srgb(255,255,255)
  22: 8x11+720+606 723.5,611.0 72 srgb(255,255,255)
  23: 2x20+0+628 0.3,637.5 30 srgb(255,255,255)

这些字段的标题是输出的开头,但基本上是看blob 14:

 14: 39x58+180+560 201.5,587.8 862 srgb(255,255,255)

它是39像素宽,58像素高,位于距离左上角180,560的偏移处,它是白色的(255,255,255),由于我否定了图像,这意味着它在原始图像中是黑色的,因此它对应于你的文字的大小(50x70左右)。

仅作为解释(对于实际处理不是必需的),让我们将其作为矩形绘制到提取物上:

convert extract.png -fill red -draw "rectangle 180,560 219,617" aBlob.png

enter image description here

请注意,我们有图像偏移量加上宽度和高度,而以下-draw rectangle命令采用左上角和右下角,因此我们需要将宽度和高度添加到偏移量以获得右下角角。

好,所以我们现在可以制作所有字母的面具!

convert extract.png -colorspace gray -negate -threshold 50% -define connected-components:verbose=true -connected-components 8 -auto-level output.png | awk -F"[ x+]" '/255,255,255/ && $4<=50 && $5<=80{printf "fill white rectangle %d,%d %d,%d\n",$6,$7,$6+$4,$7+$5}' > draw.txt

输出(在文件draw.txt中)

fill white rectangle 136,559 174,618
fill white rectangle 790,559 827,618
fill white rectangle 837,559 874,618
fill white rectangle 230,560 267,618
fill white rectangle 742,560 779,618
fill white rectangle 180,560 219,618
fill white rectangle 114,606 122,617
fill white rectangle 720,606 728,617
fill white rectangle 0,628 2,648

以下是如何将所有受保护的blob放入掩码中:

convert -size 1020x660 xc:black -draw @draw.txt mask.png

导致这个掩码:

enter image description here

然后我们可以将蒙版应用于图像:

convert extract.png mask.png -compose copyopacity -composite result.png

enter image description here