陈建华的博客
专注web开发
opencv 轮廓提取文字
2019-10-17 10:48:57   阅读52次

基于轮廓提取图像文字

输入图像:

20180117110917652.jpg

输出图像: 

20180117111945167.png

Python使用opencv实现

实验环境:Window下使用Python的Opencv库

通过阈值进行前后景分割(将线条和A4纸分开) 
先将输入图片转为灰度图,然后使用阈值分割函数实现二值化:

img = cv2.imread('input.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,190,255,cv2.THRESH_BINARY)
cv2.imwrite("thresh.jpg", thresh)


cv2.threshold第二个参数灰度值表示小于该值就将其变为0

20180117112524344.jpg

形态学图像处理(膨胀腐蚀) 

膨胀就是求局部最大值的操作,腐蚀就是求局部最小值,所以相当于做最大值最小值滤波。我们为了让轮廓更明显,所以需要做腐蚀处理。

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
eroded = cv2.erode(thresh, kernel)
cv2.imwrite("eroded.jpg", eroded)


用getStructuringElement函数定义一个10×10的十字结构元素,用作选取的周围点。 
腐蚀后:

20180117112535626.jpg

轮廓检测

contours, hierarchy = cv2.findContours(eroded,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

findContours函数 

参数

第一个参数是寻找轮廓的图像; 
第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口): 
cv2.RETR_EXTERNAL表示只检测外轮廓 
cv2.RETR_LIST检测的轮廓不建立等级关系 
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。 
cv2.RETR_TREE建立一个等级树结构的轮廓。 
第三个参数method为轮廓的近似办法 
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1 
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

返回值 

cv2.findContours()函数首先返回一个list值,list中每个元素都是图像中的一个轮廓也就我们要用到的contours。

选取边界矩形:

for c in contours:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(img, (x, y), (x + w, y + h), color, 1)

20180117112848809.jpg

通过ROI将每张图片输出 
通过矩形轮廓输出提取的笔划图像,这里直接用imwrite输出。 

20180117113351200.png

完整代码:

# -*- coding: utf-8 -*-
import cv2
img = cv2.imread('input.jpg')
result = img.copy()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,190,255,cv2.THRESH_BINARY)
cv2.imwrite("thresh.jpg", thresh)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
eroded = cv2.erode(thresh, kernel)
cv2.imwrite("eroded.jpg", eroded)
binary, contours, hierarchy = cv2.findContours(eroded,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
color = (0, 255, 0)
for c in contours:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(img, (x, y), (x + w, y + h), color, 1)
temp = result[y:(y + h), x:(x + w)]
cv2.imwrite("./result/" + str(x) + ".jpg", temp)
cv2.imwrite("result.jpg", img)



-----------------------------------------------------
转载请注明来源此处
原地址:#

-----网友评论----
暂无评论
-----发表评论----
微网聚博客乐园 ©2014 blog.mn886.net 鲁ICP备14012923号   网站导航