OpenCV实现特定颜色线条提取与定位教程
本文介绍如何利用OpenCV库实现图像中特定颜色线条的提取与精确定位。通过RGB转HSV色彩空间转换,结合inRange函数进行颜色分割,并经过二值化、膨胀去噪及findContours轮廓检测,最终使用boundingRect获取坐标并绘制矩形框。该方法适用于试卷批改字识别、工业检测等场景,提供完整的Python代码实现与参数解析。
OpenCV颜色提取与定位概述
本文演示如何利用OpenCV库中的函数,简单实现图像中特定颜色线条的提取与定位。基于此技术基础,可进一步应用于特定颜色物体的前景分割与定位,或特定颜色线条的精准提取。
核心处理步骤详解
主要步骤如下:
首先将RGB图像转换为HSV色彩空间。其中,H代表色调(取值范围0-180度),S代表饱和度(取值0-255),V代表亮度(取值0-255)。不同颜色对应不同的HSV取值范围,通常参考如下标准范围。
设定待提取颜色的HSV上下限范围,随后调用inRange函数对颜色空间进行提取。该函数会将非目标颜色的区域处理为黑色背景,仅保留目标颜色作为前景。
cv2.inRange(hsv, lower_red, upper_red)
参数解析:
第一个参数hsv指代输入的原始图像。
第二个参数lower_red定义了下限阈值,图像中低于此值的像素将被置为0。
第三个参数upper_red定义了上限阈值,图像中高于此值的像素将被置为0。
介于lower_red与upper_red之间的像素值将被设置为255。
二值化
执行腐蚀与膨胀操作,以去除噪点并连接断开的线条。
调用findContours函数进行轮廓检测。
cv2.findContours()函数接收的输入图像必须为二值图(黑白图像),而非灰度图。
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
参数解析:
第一个参数指定用于寻找轮廓的图像。
第二个参数表示轮廓的检索模式,共有四种模式(本文介绍均基于新版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.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain近似算法。
返回值:
cv2.findContours()函数返回三个值:图像本身、轮廓列表,以及每条轮廓对应的属性。
轮廓以坐标形式返回,可通过函数cv2.drawContours()绘制出轮廓。
绘制矩形区域以实现对轮廓的精确定位。
Python代码实现与效果展示
主要代码如下:
import numpy as np
import cv2
import os
image = 'image1.jpg'
savefile = './mark1'
# image = os.listdir(image_file)
save_image = os.path.join(savefile, image)
#设定颜色HSV范围,假定为红色
redLower = np.array([156, 43, 46])
redUpper = np.array([179, 255, 255])
#读取图像
img = cv2.imread(image)
#将图像转化为HSV格式
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#去除颜色范围外的其余颜色
mask = cv2.inRange(hsv, redLower, redUpper)
# 二值化操作
ret, binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY)
#膨胀操作,因为是对线条进行提取定位,所以腐蚀可能会造成更大间隔的断点,将线条切断,因此仅做膨胀操作
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(binary, kernel, iterations=1)
#获取图像轮廓坐标,其中contours为坐标值,此处只检测外形轮廓
_, contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) > 0:
#cv2.boundingRect()返回轮廓矩阵的坐标值,四个值为x, y, w, h, 其中x, y为左上角坐标,w,h为矩阵的宽和高
boxes = [cv2.boundingRect(c) for c in contours]
for box in boxes:
x, y, w, h = box
#绘制矩形框对轮廓进行定位
cv2.rectangle(img, (x, y), (x+w, y+h), (153, 153, 0), 2)
#将绘制的图像保存并展示
cv2.imwrite(save_image, img)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如图,以试卷上的红色批改字样为例:
原图:

对批改区域定位图:

以上这篇opencv 实现特定颜色线条提取与定位操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













