机器视觉与深度学习(OpenCV-Python)案例分析3:提取轮廓与面积筛选
·
案例内容
将图像内的文字轮廓显示出来

案例原理
在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()
运行结果

更多推荐


所有评论(0)