首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于白区的水平图像分割方法

基于白区的水平图像分割方法
EN

Stack Overflow用户
提问于 2018-06-11 14:34:54
回答 2查看 91关注 0票数 2

我正在准备一张tesseractocr的图片。到目前为止,我所做的是将我的形象转变为:

原创

我主要想要的是根据白色区域将图像切割成水平部分。就像这样:

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

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

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

另一件重要的事情是,没有预定义的大小,所以假设这张图片中的大小是标准的是错误的。

的重述:如何基于白区水平裁剪图像

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-11 15:40:28

我查了一下文档,看看是否需要任何东西。是的,我偶然发现了一个有趣的属性,叫做来自本页的等高线的。

等高线的范围被定义为等高线的面积与该轮廓的边界矩形面积的比值。因此,这个值越接近于1,轮廓越像一个矩形。

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

代码:

代码语言:javascript
运行
复制
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引擎。

票数 2
EN

Stack Overflow用户

发布于 2018-06-11 15:26:40

您可以使用参数来增加或减少行数。我跟着本指南

加载和反转图像:

代码语言:javascript
运行
复制
import cv2
import numpy as np

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

获得边缘:

代码语言:javascript
运行
复制
edges = cv2.Canny(gray,50,150,apertureSize = 5)
minLineLength = 10
maxLineGap = 30

用概率Hough变换求直线:

代码语言:javascript
运行
复制
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度之间(你可以根据需要调整):

代码语言:javascript
运行
复制
        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)

产生了这幅图像:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50800230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档