将文本图像分离为组件字符图像

blo*_*ork 5 python image-processing python-imaging-library

我想将文本图像分成它的组成字符,也作为图像.例如,使用下面的示例,我最终会得到14张图像.

我只会在一行上使用文字,所以y高度并不重要 - 我需要找到的是每个字母的开头和结尾以及裁剪到那些坐标.这样我也可以避免'i','j'等问题.

我是图像处理的新手,我不知道如何去做.某种形式的边缘检测?有没有办法确定纯色的连续区域?任何帮助都很棒.

试图提高我的Python技能和熟悉一些可用的库,所以我使用的是Python Imaging Library(PIL),但我也看过OpenCV.


示例图片:

这是一些文字

And*_*res 5

这不是一件容易的事,特别是如果背景不均匀的话.如果您拥有的是已经是二进制图像的示例,则稍微简单一些.

如果您的图像不是二进制,则可以开始应用阈值算法(Otsu自适应阈值效果很好)

之后,您可以使用标记算法来识别形成您的形状的每个"孤岛"(在这种情况下为每个字符).

当你有噪音时会出现问题.标记但不符合您兴趣的形状.在这种情况下,您可以使用一些启发式方法来确定形状是否为字符(如果文本位于定义良好的位置,则可以使用标准化区域,对象的位置等).如果这还不够,您将需要处理更复杂的人员,如形状特征提取算法和某种模式识别算法,如多层感知器.

要完成,这似乎是一项简单的任务,但根据您的图像质量,它可能会变得更难.这里引用的算法可以很容易地在互联网上找到,也可以在OpenCv等一些库中实现.

如果我当然可以提供帮助,请问更多帮助;)


Mar*_*ell 5

我知道我迟到了几年:-)但你可以很容易地使用ImageMagick做这件事,直接在命令行上编译而不编译任何内容,因为它内置了Connected Component Analysis:

这是一种方法:

#!/bin/bash
image="$1"
draw=$(convert $image                              \
   -threshold 50%                                  \
   -define connected-components:verbose=true       \
   -define connected-components:area-threshold=10  \
   -connected-components 8                         \
   -auto-level objects.png | \
   awk 'BEGIN{command=""}
        /\+0\+0/||/id:/{next}
        {
          geom=$2
          gsub(/x/," ",geom)
          gsub(/+/," ",geom)
          split(geom,a," ")
          d=sprintf("-draw \x27rectangle %d,%d %d,%d\x27 ",a[3],a[4],a[3]+a[1],a[4]+a[2])
          command = command d
          #printf "%d,%d %d,%d\n",a[3],a[4],a[3]+a[1],a[4]+a[2]
        }
        END{print command}')

eval convert "$image" -fill none -strokewidth 2 -stroke red $draw result.png
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

首先,我将你的图像阈值设置为50%,这样它就只有纯黑色和白色,没有色调渐变.然后我告诉ImageMagick输出它找到的边界框的详细信息,并且我对总面积小于10像素的对象不感兴趣.然后我允许像素为8连接,即它们的对角线邻居(NE,SE,NW,SW)以及它们的左右和上下邻居.最后,我解析边界框输出,awk在边界框周围绘制红线.

我解析的初始命令的输出awk如下所示:

Objects (id: bounding-box centroid area mean-color):
  0: 539x53+0+0 263.7,24.3 20030 srgba(255,255,255,1)
  11: 51x38+308+14 333.1,30.2 869 srgba(0,0,0,1)
  13: 35x39+445+14 461.7,32.8 670 srgba(0,0,0,1)
  12: 35x39+365+14 381.7,32.8 670 srgba(0,0,0,1)
  2: 30x52+48+0 60.4,27.0 634 srgba(0,0,0,1)
  1: 41x52+1+0 20.9,16.6 600 srgba(0,0,0,1)
  8: 30x39+174+14 188.3,33.1 595 srgba(0,0,0,1)
  7: 30x39+102+14 116.3,33.1 595 srgba(0,0,0,1)
  9: 30x39+230+14 244.3,33.1 595 srgba(0,0,0,1)
  10: 35x39+265+14 282.2,33.0 594 srgba(0,0,0,1)
  16: 33x37+484+15 500.2,33.0 520 srgba(0,0,0,1)
  17: 22x28+272+19 282.3,32.8 503 srgba(255,255,255,1)
  5: 18x51+424+2 432.5,27.9 389 srgba(0,0,0,1)
  6: 18x51+520+2 528.5,27.9 389 srgba(0,0,0,1)
  15: 6x37+160+15 162.5,33.0 222 srgba(0,0,0,1)
  14: 6x37+88+15 90.5,33.0 222 srgba(0,0,0,1)
  18: 22x11+372+19 382.6,24.9 187 srgba(255,255,255,1)
  19: 22x11+452+19 462.6,24.9 187 srgba(255,255,255,1)
  3: 6x8+88+0 90.5,3.5 48 srgba(0,0,0,1)
  4: 6x8+160+0 162.5,3.5 48 srgba(0,0,0,1)
Run Code Online (Sandbox Code Playgroud)

awk转入此

convert http://imgur.com/AVW7A.png -fill none -strokewidth 2 -stroke red \
-draw 'rectangle 308,14 359,52'        \
-draw 'rectangle 445,14 480,53'        \
-draw 'rectangle 365,14 400,53'        \
-draw 'rectangle 48,0 78,52'           \
-draw 'rectangle 1,0 42,52'            \
-draw 'rectangle 174,14 204,53'        \
-draw 'rectangle 102,14 132,53'        \
-draw 'rectangle 230,14 260,53'        \
-draw 'rectangle 265,14 300,53'        \
-draw 'rectangle 484,15 517,52'        \
-draw 'rectangle 272,19 294,47'        \
-draw 'rectangle 424,2 442,53'         \
-draw 'rectangle 520,2 538,53'         \
-draw 'rectangle 160,15 166,52'        \
-draw 'rectangle 88,15 94,52'          \
-draw 'rectangle 372,19 394,30'        \
-draw 'rectangle 452,19 474,30'        \
-draw 'rectangle 88,0 94,8'            \
-draw 'rectangle 160,0 166,8' result.png
Run Code Online (Sandbox Code Playgroud)