案例内容

将图像内的文字轮廓显示出来

word.jpg

原始图像

案例原理

在OpenCV中,可以使用函数cv2.findContours()查找图像中的轮廓,提取出的轮廓会包括噪声轮廓(本例中用白点表示),需要进一步处理。从面积角度看,要提取的文字轮廓一般较大,而噪声轮廓一般较小。本例中以面积作为筛选标准,筛选出面积大于特定值的轮廓并进行显示。

重要代码

contours, hierarchy = cv2.findContours(image, mode, method)
表示从二值化图像中提取轮廓,其中:

  • contours为提取出的轮廓
  • hierarchy为轮廓的属性
  • image为提取的图像,此处的图像必须为二值化图像,不能为普通的灰度图像
  • mode为轮廓的模式,本例使用cv2.RETR_LIST,表示检测的轮廓不建立等级关系。
  • method为轮廓的近似方法,本例使用cv2.CHAIN_APPROX_SIMPLE,表示只保留轮廓顶点坐标

area = cv2.contourArea(contour, [oriented])
表示轮廓contour围成图形的面积,其中oriented为一个布尔值,表示轮廓的方向是否要考虑进去,本例使用默认值False,即不考虑轮廓方向,返回的area为绝对值。

代码实现

首先要导入库,获取原始图像,即:

import cv2
img = cv2.imread("word.jpg")

之后将原始图像转化为灰度图像。转化后,将灰度图像二值化,以便于轮廓提取,即:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) 

再将二值化图像进行轮廓提取,即:

cons, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

然后按照面积筛选轮廓,先初始化一个列表存放筛选结果。之后遍历所有轮廓,将轮廓面积大于阈值的轮廓判定为文字轮廓,存放进列表中,本例中阈值选用425:

con = []                               
for i in cons:
    if cv2.contourArea(i) > 425:        
        con.append(i)

最后进行结果展示,将筛选出的轮廓显示在原始图像上,进行展示:

cv2.drawContours(img, con, -1, (0, 0, 255), 2) 
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

最终代码为:

#===导入库===
import cv2
#===获取图像并处理===
img = cv2.imread("word.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) 
#===从二值化图像中提取轮廓===
cons, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
#===按照面积筛选轮廓===
con = []                                #筛选结果列表初始化
for i in cons:
    if cv2.contourArea(i) > 425:        #面积筛选,面积阈值为425
        con.append(i)
#===结果展示===
cv2.drawContours(img, con, -1, (0, 0, 255), 2) 
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果

运行结果

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐