グリッド線の少なくとも一部が正確にまたはほぼ正確に垂直であると仮定すると、かなり単純なアプローチが機能する可能性があります。
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()
結果
説明のために検出された垂直線を赤で表示
ご覧のとおり、4本のグリッド線が検出され、本の左側と右側、および中央を無視するように処理されているため、目的のタイプで誤検知が発生することはありません。
これは、上記のコードを使用して黒い柱を検出し、端または中央に近い柱を破棄できることを意味します。黒い柱が残っている場合は、それを「その他の」望ましくないクラスの画像として分類します。