4

我有许多来自中国家谱的图像,我希望能够以编程方式对它们进行分类。一般来说,一种类型的图像主要具有逐行文本,而另一种类型可能是网格或图表格式。

示例照片

问题:有没有(相对)简单的方法来做到这一点?我有使用 Python 的经验,但对图像处理知之甚少。对其他资源的指导也受到赞赏。

谢谢!

4

2 回答 2

3

假设至少有一些网格线完全或几乎完全垂直,一个相当简单的方法可能会奏效。

我使用PIL来查找图像中超过一半的像素比某个阈值暗的所有列。

代码

import Image, ImageDraw # PIL modules

withlines = Image.open('withgrid.jpg')
nolines   = Image.open('nogrid.jpg')

def findlines(image):
    w,h, = image.size
    s = w*h
    im = image.point(lambda i: 255 * (i < 60))   # threshold
    d = im.getdata()      # faster than per-pixel operations

    linecolumns = []

    for col in range(w):
        black = sum( (d[x] for x in range(col, s, w)) )//255
        if black > 450:
            linecolumns += [col]

    # return an image showing the detected lines
    im2 = image.convert('RGB')
    draw = ImageDraw.Draw(im2)        
    for col in linecolumns:
        draw.line( (col,0,col,h-1), fill='#f00', width = 1)

    return im2

findlines(withlines).show()
findlines(nolines).show()

结果

以红色显示检测到的垂直线以进行说明

图 1在此处输入图像描述

如您所见,检测到了四个网格线,并且经过一些处理以忽略书的左右两侧和中心,在所需类型上应该没有误报。

这意味着您可以使用上面的代码来检测黑色列,丢弃靠近边缘或中心的那些。如果仍有任何黑色列,则将其归类为“其他”不受欢迎的图片类别。

于 2012-10-30T16:51:22.683 回答
0

AFAIK,没有简单的方法可以解决这个问题。您将需要大量的图像处理和一些基本的机器学习来对这些类型的图像进行分类(甚至可能不会 100% 成功)

另一个注意事项:

虽然这只能通过使用机器学习技术来解决,但我建议您首先开始搜索一些图像处理技术,并尝试将您的图像转换为两种图像都有相当大差异的形式。为此,您最好开始阅读有关fft的信息。之后看看一些数字图像处理技术。当您觉得自己对这些有很好的理解时,您可以阅读模式识别

这只是一种建议的方法,还有更多方法可以实现这一点。

于 2012-10-30T15:58:53.980 回答