改善文本区域检测(OpenCV,Python) [英] Improve text area detection (OpenCV, Python)

查看:519
本文介绍了改善文本区域检测(OpenCV,Python)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在做一个项目,要求我检测图像中的文本区域.这是我到目前为止使用下面的代码实现的结果.

I am working on a project which ask me to detect text area in an image. This is the result I achieved until now using the code below.

原始图片

结果

代码如下:

import cv2
import numpy as np

# read and scale down image
img = cv2.pyrDown(cv2.imread('C:\\Users\\Work\\Desktop\\test.png', cv2.IMREAD_UNCHANGED))

# threshold image
ret, threshed_img = cv2.threshold(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),
                                  127, 255, cv2.THRESH_BINARY)
# find contours and get the external one
image, contours, hier = cv2.findContours(threshed_img, cv2.RETR_TREE,
                                         cv2.CHAIN_APPROX_SIMPLE)

# with each contour, draw boundingRect in green
# a minAreaRect in red and
# a minEnclosingCircle in blue
for c in contours:
    # get the bounding rect
    x, y, w, h = cv2.boundingRect(c)
    # draw a green rectangle to visualize the bounding rect
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), thickness=1, lineType=8, shift=0)

    # get the min area rect
    #rect = cv2.minAreaRect(c)
    #box = cv2.boxPoints(rect)
    # convert all coordinates floating point values to int
    #box = np.int0(box)
    # draw a red 'nghien' rectangle
    #cv2.drawContours(img, [box], 0, (0, 0, 255))

    # finally, get the min enclosing circle
    #(x, y), radius = cv2.minEnclosingCircle(c)
    # convert all values to int
    #center = (int(x), int(y))
    #radius = int(radius)
    # and draw the circle in blue
    #img = cv2.circle(img, center, radius, (255, 0, 0), 2)

print(len(contours))
cv2.drawContours(img, contours, -1, (255, 255, 0), 1)

cv2.namedWindow('contours', 0)
cv2.imshow('contours', img)
while(cv2.waitKey()!=ord('q')):
    continue
cv2.destroyAllWindows()

如您所见,这可以做很多我需要做的事情.如果需要更多内容,请查找有注释的部分.

As you can see, this can do more than I need. Look for commented parts if you need more.

顺便说一句,我需要的是将每个文本区域绑定到一个矩形中,而不是(靠近)脚本要查找的每个字符.过滤单个数字或字母,然后将所有内容都放在一个框中.

By the way, what I need is to bound every text area in a single rectangle not (near) every char which the script is finding. Filter the single number or letter and to round everything in a single box.

例如,一个方框中的第一个序列,另一个方框中的第二个序列,依此类推.

For example, the first sequence in a box, the second in another one and so on.

我进行了一些搜索,发现了一些有关过滤器矩形区域"的信息.我不知道它是否对我有用.

I searched a bit and I found something about "filter rectangle area". I don't know if it is useful for my purpose.

还查看了Google上的一些第一批结果,但大多数结果效果都不理想.我想代码需要进行一些调整,但是我是OpenCV世界中的新手.

Tooked a look also at some of the first result on Google but most of them don't work very well. I guess the code need to be tweaked a bit but I am a newbie in OpenCV world.

推荐答案

使用以下代码已解决.

import cv2

# Load the image
img = cv2.imread('image.png')

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# smooth the image to avoid noises
gray = cv2.medianBlur(gray,5)

# Apply adaptive threshold
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)
thresh_color = cv2.cvtColor(thresh,cv2.COLOR_GRAY2BGR)

# apply some dilation and erosion to join the gaps - change iteration to detect more or less area's
thresh = cv2.dilate(thresh,None,iterations = 15)
thresh = cv2.erode(thresh,None,iterations = 15)

# Find the contours
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

# For each contour, find the bounding rectangle and draw it
for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
    cv2.rectangle(thresh_color,(x,y),(x+w,y+h),(0,255,0),2)

# Finally show the image
cv2.imshow('img',img)
cv2.imshow('res',thresh_color)
cv2.waitKey(0)
cv2.destroyAllWindows()

需要修改以获得以下结果的参数是erodedilate函数中的迭代次数. 较低的值将在(几乎)每个数字/字符周围创建更多的边界矩形.

Parameters that need to be modified to obtain the result below is numbers of iterations in erode and dilate functions. Lower values will create more bounding rectangles around (nearly) every digit/character.

结果

这篇关于改善文本区域检测(OpenCV,Python)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆