如何在opencv中改变轮廓形成的面积(阈值)

时间:2018-09-16 07:43:03

标签: python opencv ocr tesseract opencv-contour

我正在尝试构建用于从图像中提取文本的OCR,我正在使用轮廓线来形成文本字符的边界,

在多次尝试更改cv2.threshold后,我在形成文本字符边界时得到了最合适的轮廓。

#files = os.listdir(r'letters/harry.jpeg',0)
file = r'/home/naga/Documents/Naga/Machine Learning/Data_extract/letters/Harry/Harry Potter and the Sorcerer s Stone-page-006.jpg'
im1 = cv2.imread(file,0)
im = cv2.imread(file)

# ret,thresh1 = cv2.threshold(im1,180,278,cv2.THRESH_BINARY)
# _,contours, hierarchy = cv2.findContours(thresh1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

ret,thresh1 = cv2.threshold(im1,180,278,cv2.THRESH_BINARY)
kernel = np.ones((5,5),np.uint8)
dilated = cv2.dilate(im1,kernel,iterations = 1)
_,contours, hierarchy = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    #bound the images
    cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),1)

cv2.namedWindow('BindingBox', cv2.WINDOW_NORMAL)
cv2.imwrite('output2/BindingBox4.jpg',im)

Contours on text with Opencv

现在,我想在单词上创建轮廓。我需要每个单词的父级轮廓。 Open cv中要更改的属性是什么。

我是opencv的新手,我一直遵循cv2 threshold,但无法理解如何将其应用于它。请给您输入以形成单词轮廓的信息。

original pic

1 个答案:

答案 0 :(得分:2)

一种简单的解决方案是在运行findcontour函数之前扩大阈值图像的结果。

ret,thresh1 = cv2.threshold(im1,180,255,cv2.THRESH_BINARY_INV)
kernel = np.ones((5,5),np.uint8)
dilated = cv2.dilate(thresh1,kernel,iterations = 2)
contours, hierarchy = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

扩张是一种形态学功能,会增加二值斑点的面积。它将倾向于合并所有附近的Blob以形成单个Blob,这正是将文本组合成单词所需要的。

如果不是所有文本都组合成一个单词,则可以增加迭代次数。如果您不确定此处要使用的值,则需要反复试验。

仔细阅读形态学过程以更好地理解该主题。这是用于基本图像处理的有用工具。

作为一个额外的提示,请尝试在openCV中搜索功能adaptivethreshold。对文本图像进行二值化处理将使您的生活更加轻松。