如何根据白色区域水平切割图像

how to cut image horizontally based on white regions

我正在为 tesseractocr 准备图像。到目前为止我所做的是将我的图像转换为以下内容:

Original

我基本上想要的是根据白色区域将图像剪切成水平部分。像这样:

我最关心的是左边和中间的文字区域

如果我只选择左边的区域,问题是我无法找到一种方法在不删除某些部分的情况下也选择中间的区域。

我面临的另一个问题是,如果我给 tesseract 所有区域(我已经成功地提取了每个包含文本的区域),它给了我垃圾,因为图片既有拉丁语也有 none 拉丁语。

另一个重要的是没有预定义尺寸,所以假设这张图片中的尺寸是标准尺寸是错误的。

重述:如何根据白色区域水平裁剪图片

您可以使用参数来增加或减少行数。我关注了this guide

加载和反转图像:

import cv2
import numpy as np

img = cv2.imread('lic.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = 255 - img

获得优势:

edges = cv2.Canny(gray,50,150,apertureSize = 5)
minLineLength = 10
maxLineGap = 30

使用概率霍夫变换查找直线:

lines = cv2.HoughLinesP(edges,.7,np.pi/180, 100,minLineLength,maxLineGap)

for line in lines:
    for x1,y1,x2,y2 in line:
        if x2-x1 == 0:
            continue

检查坡度是否在-45度到45度之间(可以根据需要调整):

        dy = (y2 - y1) 
        dx = (x2 -x1)
        if -1 < dy/dx < 1:
            cv2.line(img,(x1 + dx*-100,y1 + dy*-100),(x2 + dx*100,y2 + dy*100),(0,255,0),2)


cv2.imshow("image: " + str(len(lines)) , img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite('houghlines3.jpg',img)

这张图片的制作者:

我查阅了文档,看看是否可以使用任何东西。是的,我遇到了一个有趣的 属性,称为 extent 来自 THIS PAGE.

的轮廓

等高线的范围定义为等高线面积该等高线边界矩形面积的比率。所以这个值越接近 1,轮廓越像矩形。

对于您提供的图像,它没有检测到看起来像阿拉伯语的单词。但如果在此之前进行一些形态学操作,它会起作用。

代码:

path = 'C:/Users/Desktop/Stack/contour/'
im = cv2.imread(path + 'lic.png')

#--- resized because the image was to big ---
im = cv2.resize(im, (0, 0), fx = 0.5, fy = 0.5)
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

ret2, th2 = cv2.threshold(imgray, 0, 255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)

im2 = im.copy()
_, contours, hierarchy = cv2.findContours(th2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
count = 0

#--- It all begins here ---
for cnt in contours:
        area = cv2.contourArea(cnt)
        x, y, w, h = cv2.boundingRect(cnt)
        rect_area = w * h
        extent = float(area) / rect_area
        if (extent > 0.5) and (area > 100):      #--- there were some very small rectangular regions hence I used the area criterion ---
            count+=1
            cv2.drawContours(im2, [cnt], 0, (0, 255, 0), 2)

cv2.imshow(path + 'contoursdate.jpg', im2)

print('Number of possible words : {}'.format(count))

结果:

在这种情况下,我只是绘制了轮廓。另一方面,您可以通过拟合边界矩形来裁剪这些区域,并将它们分别提供给 OCR 引擎。