我在白色背景上有一些黑色文字的扫描文档图像。我首先反转图像,因此背景=黑色,所有文本=白色。
然后我使用OpenCV的reduce()
函数给我一个垂直投影图像,看起来有点像:(图像中每行所有像素值的总和) < / p>
0,
0,
0,
434
34
0,
0,
由此可以看出,0像素值表示背景,而值<>。 0描述了一些文字。
从这里开始,我循环查找像素值,查找下一个值!= 0(下一个值包含文本)的任何0值,并将位置存储在两个元组列表中pairedCoordinates
:[(23, 43), (54, 554)]
等......
从那时起,我可以遍历pairedCoordinates
并在我感兴趣的区域周围绘制boundingRects
:
for start, finish in pairedCoordinates:
height = finish - start
cv2.rectangle(small, (0, start), (0+cols, start + height), (255, 255, 255), 1)
到目前为止,一切正常。我接下来要做的是,对于每个矩形,将其内部内容(像素)附加到另一个列表,这样我就可以仅对rects中包含的图像的各个部分执行进一步的计算。
我尝试了以下内容:
# Initialise an empty list
roi = []
然后在上面的for循环中,我添加了额外的:
for start, finish in pairedCoordinates:
height = finish - start
cv2.rectangle(small, (0, start), (0+cols, start + height), (255, 255, 255), 1)
# cols = the number of collumns in the image, small being the image
glyph = small[y: start + height, x:0+cols]
roi.append(glyph)
尝试此代码时,我得到'未解析的x&amp; amp;我有点不确定为什么。
有人可以指出我如何真正实现我上面解释的正确方向。
更新
正如Miki在评论中所提到的,我忘了初始化x,y。
我在计算字形之前简单地定义了x=0 y=0
,这似乎就是诀窍。
我遇到了一些循环遍历每个区域并将它们写入文件的问题。创建的每个新图像文件只是将下一个像素附加到现有图像,而不是单独写入每个边界矩形?
for i, r in enumerate(roi):
cv2.imwrite("roi_%02d.png" % i, r)