假设至少有一些网格线完全或几乎完全垂直,一个相当简单的方法可能会奏效。
我使用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()
结果
以红色显示检测到的垂直线以进行说明
如您所见,检测到了四个网格线,并且经过一些处理以忽略书的左右两侧和中心,在所需类型上应该没有误报。
这意味着您可以使用上面的代码来检测黑色列,丢弃靠近边缘或中心的那些。如果仍有任何黑色列,则将其归类为“其他”不受欢迎的图片类别。