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

时间:2018-06-11 14:34:55

标签: opencv opencv3.0

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

Original

original image

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

desired behavior

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

desired behavior 2

如果我只挑选左边区域的问题是我找不到一种方法来挑选中间的那些而不删除一些部分。

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

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

概括说明:如何根据白色区域水平切割图像

2 个答案:

答案 0 :(得分:2)

您可以使用参数来增加或减少行数。我跟着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

使用概率Hough变换查找线条:

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)

产生了这张图片:

enter image description here

答案 1 :(得分:2)

我查看了文档,看看我是否可以使用任何东西。是的,我遇到了一个名为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))

<强>结果:

enter image description here

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