我有一些来自中国家谱的图像,我希望能够以编程方式对它们进行分类。一般而言,一种类型的图像主要具有逐行文本,而另一种类型可以是网格或图表格式。
示例照片
'期望'输入:http://www.flickr.com/photos/63588871@N05/8138563082/
'其他'输入:http://www.flickr.com/photos/63588871@N05/8138561342/in/photostream/
问题:有(相对)简单的方法吗?我有Python的经验,但对图像处理知之甚少。其他资源的方向也受到赞赏。
谢谢!
答案 0 :(得分: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 :(得分:0)
AFAIK,没有简单的方法可以解决这个问题。您将需要大量的图像处理和一些基本的机器学习来对这些类型的图像进行分类(甚至可能不会100%成功)
另一个注意事项:
虽然这可以通过仅使用机器学习技术来解决,但我建议您首先开始搜索一些图像处理技术,并尝试将图像转换为两个图像具有相当差异的形式。为此,您最好开始阅读fft。之后,看看一些digital image processing技术。当您对这些内容有一个正确的理解感到满意时,可以阅读pattern recognition。
这只是一种建议的方法,有更多方法可以实现这一目标。