参考:《计算机视觉开发实践》朱文伟 李建英 著
前言
imgproc的模块名称是由image(图像)和process(处理)两个单词的缩写组合而成的,是重要的图像处理模块,主要包括图像滤波、几何变换、直方图、特征检测与目标检测等。
这个模块包含一系列的常用图像处理算法。相对而言,imgproc是OpenCV一个比较复杂的模块。
OpenCV中的一些画图函数也属于这个模块。
5.1 颜色变换 cvtColor
函数:
cv.cvtColor(src, code[, dst[, dstCn]])
参数说明:
- src:输入图像,即要进行颜色空间变换的原图像,可以是数组矩阵。
- code:颜色空间转换代码,即在此确定将什么制式的图片转换成什么制式的图片。
- dst:输出图像,即进行颜色空间变换后存储图像。
- dstCn:目标图像的通道数,默认取值为0,如果参数为0,则从src和代码自动获得通道的数量。
说明:
函数cvtColor的作用是将一个图像从一个颜色空间转换到另一个颜色空间,但是从RGB向其他类型转换时必须明确指出图像的颜色通道。
值得注意的是,在OpenCV中,其默认的颜色制式排列是BGR而非RGB。对于24位颜色图像来说,前8位是蓝色,中间8位是绿色,最后8位是红色
示例代码:
import cv2
img = cv2.imread('test.jpg')
# 将BGR图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 将BGR图像转换为HSV图像
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Gray', gray)
cv2.imshow('HSV', hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.2 基本图像绘制
矩形
函数:
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]] ) -> img
参数说明:
- img:要绘制图形的图像,可以是数组矩阵。
- pt1, pt2:矩形的左上角和右下角坐标。
- color:矩形的颜色,可以是BGR格式的元组。
- thickness:矩形边框的线宽,负值表示填充矩形。
- lineType:线条类型,默认值为8(8-connected line)。
- shift:坐标点的小数位数。
直线
函数:
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]] ) -> img
参数说明:
- img:要绘制图形的图像,可以是数组矩阵。
- pt1, pt2:直线的起点和终点坐标。
- color:直线的颜色,可以是BGR格式的元组。
- thickness:直线的线宽。
- lineType:线条类型,默认值为8(8-connected line)。
- shift:坐标点的小数位数。
圆形
函数:
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]] ) -> img
参数说明:
- img:要绘制图形的图像,可以是数组矩阵。
- center:圆心坐标。
- radius:圆的半径。
- color:圆的颜色,可以是BGR格式的元组。
- thickness:圆边框的线宽,负值表示填充圆。
- lineType:线条类型,默认值为8(8-connected line)。
- shift:坐标点的小数位数。
多边形
函数:
cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]] ) -> img
参数说明:
- img:要绘制图形的图像,可以是数组矩阵。
- pts:多边形的顶点坐标列表。
- isClosed:布尔值,表示多边形是否闭合。
- color:多边形的颜色,可以是BGR格式的元组。
- thickness:多边形边框的线宽。
- lineType:线条类型,默认值为8(8-connected line)。
- shift:坐标点的小数位数。
5.3 文字绘制
函数:
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) -> img
参数说明:
- img:要绘制文字的图像,可以是数组矩阵。
- text:要绘制的文字字符串。
- org:文字的左下角坐标。
- fontFace:字体类型,如cv2.FONT_HERSHEY_SIMPLEX等。
- fontScale:字体缩放因子。
- color:文字颜色,可以是BGR格式的元组。
- thickness:文字线宽。
- lineType:线条类型,默认值为8(8-connected line)。
- bottomLeftOrigin:布尔值,表示文字基线是否在左下角。
注意:
putText函数的text参数只能接收特定字符,也就是说并不是所有的字符串都能顺利绘制。
例如,当text参数内容中包含中文时,运行结果中的中文会被“?”等字符替换,原因就是putText函数无法识别中文。如果想在图像中绘制中文文字,就需要借助其他模块或第三方库(PIL库和freetype库)的帮助。
5.4 边缘填充
这个需要另开一章来详细讲解,暂时留个坑,先说常用的几个边界类型:
- BORDER_REPLICATE
复制法,边界复制会将边界处的像素值进行复制,然后作为边界填充的像素值。中值滤波就是采用的这种方法。 - BORDER_REFLECT
反射法,根据原图的边缘进行反射。 - BORDER_REFLECT_101
对称法,与边界反射不同的是,不再反射边缘的像素点。高斯滤波边界处理的默认方法。 - BORDER_WRAP
环绕法,复制图像进行滑动填充。 - BORDER_CONSTANT
常量法,使用指定的常量值填充边界区域。
5.5 图像轮廓
轮廓是指图像中具有相似强度或颜色的像素点的集合,通常用于表示物体的边界或形状。
在OpenCV中,轮廓可以通过边缘检测算法(如Canny算法)或阈值分割等方法提取出来。
提取轮廓
函数:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
参数说明:
- image:输入的二值图像,通常是经过边缘检测或阈值分割后的图像。
- mode:轮廓检索模式,如cv2.RETR_EXTERNAL(只检索外部轮廓)等。
- method:轮廓近似方法,如cv2.CHAIN_APPROX_SIMPLE(压缩水平方向、垂直方向和对角线方向的冗余点)等。
- contours:输出的轮廓列表,每个轮廓都是一个点的集合。
- hierarchy:输出的轮廓层级关系。
- offset:可选参数,表示轮廓点的偏移量。
绘制轮廓
函数:
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]) -> image
参数说明:
- image:要绘制轮廓的图像,可以是数组矩阵。
- contours:轮廓列表,通常是通过findContours函数获得的。
- contourIdx:要绘制的轮廓索引,
- color:轮廓的颜色,可以是BGR格式的元组。
- thickness:轮廓线宽。
- lineType:线条类型,默认值为8(8-connected line)。
- hierarchy:轮廓层级关系,通常是通过findContours函数获得的。
- maxLevel:绘制轮廓的最大层级。
- offset:可选参数,表示轮廓点的偏移量。