目录
一、颜色变换cvtColor:
cv2.cvtColor
是 OpenCV 库中的一个函数,用于转换图像的颜色空间。
(1)函数原型:
cv2.cvtColor(src, code[, dst[, mask]])
(2)参数:
- src: 输入图像。
- code: 指定转换的颜色空间。这是一个整数,表示从一种颜色空间转换到另一种颜色空间的代码。
- dst: (可选)输出图像。如果提供,必须与源图像具有相同的尺寸和类型。
- mask: (可选)操作的可选掩码。如果提供,它必须是8位的单通道图像,大小与源图像相同。
(3)作用:
cv2.cvtColor
函数用于将图像从一个颜色空间转换到另一个颜色空间。例如,它可以将图像从 BGR 转换为灰度、RGB、HSV 等。
(4)颜色空间转换代码:
一些常用的颜色空间转换代码:
cv2.COLOR_BGR2BGRA
: BGR 到 BGRA 转换。cv2.COLOR_BGR2GRAY
: BGR 到灰度转换。cv2.COLOR_BGR2RGB
: BGR 到 RGB 转换。cv2.COLOR_BGR2RGBA
: BGR 到 RGBA 转换。cv2.COLOR_BGR2HSV
: BGR 到 HSV 转换。cv2.COLOR_BGR2Lab
: BGR 到 CIELAB 转换。cv2.COLOR_BGR2Luv
: BGR 到 CIE Luv 转换。cv2.COLOR_BGR2YUV
: BGR 到 YUV 转换。cv2.COLOR_RGB2GRAY
: RGB 到灰度转换。cv2.COLOR_RGB2YUV
: RGB 到 YUV 转换。cv2.COLOR_GRAY2BGR
: 灰度到 BGR 转换。cv2.COLOR_GRAY2RGB
: 灰度到 RGB 转换。
(5)示例:
使用 cv2.cvtColor
函数的示例代码:
import cv2
# 读取一个 BGR 图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\faves.png")
# 将 BGR 图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 将 BGR 图像转换为 HSV 图像
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 显示灰度图像
cv2.imshow('Gray Image', gray_image)
#cv2.waitKey(0)
# 显示 HSV 图像
cv2.imshow('HSV Image', hsv_image)
cv2.waitKey(0)
cv2.destroyAllWindows()()
二、画基本图形:
在 OpenCV 中,可以使用多种函数来绘制基本图形,如线条、矩形、圆形、多边形等。
(1)画线条:
cv2.line
函数用于在图像上绘制线条。
函数原型:
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
- img: 输入图像。
- pt1: 线条的起点。
- pt2: 线条的终点。
- color: 线条的颜色。
- thickness: 线条的厚度(默认为 1)。
- lineType: 线条的类型,如
cv2.LINE_4
、cv2.LINE_8
(默认)。 - shift: 坐标点的小数点位数。
示例代码:
import cv2
import numpy as np
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 画一条蓝色线条
cv2.line(image, (50, 50), (300, 300), (255, 0, 0), 3)
# 显示图像
cv2.imshow('Line Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)画矩形:
cv2.rectangle
函数用于在图像上绘制矩形。
函数原型:
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
- pt1: 矩形的一个角点。
- pt2: 矩形对角的点。
示例代码:
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 画一个绿色矩形
cv2.rectangle(image, (50, 50), (300, 300), (0, 255, 0), 3)
# 显示图像
cv2.imshow('Rectangle Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3)画圆形:
cv2.circle
函数用于在图像上绘制圆形。
函数原型:
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
- center: 圆心的坐标。
- radius: 圆的半径。
- color: 圆的颜色。
示例代码:
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 画一个红色圆形
cv2.circle(image, (200, 200), 100, (0, 0, 255), 3)
# 显示图像
cv2.imshow('Circle Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(4)画多边形:
cv2.polylines
函数用于在图像上绘制多边形。
函数原型:
cv2.polylines(img, [pts], isClosed, color[, thickness[, lineType[, shift]]])
- pts: 多边形的顶点,格式为一个数组的列表。
- isClosed: 是否闭合多边形。
示例代码:
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 定义多边形的顶点
pts = np.array([[100, 100], [200, 100], [200, 200], [100, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))
# 画一个多边形
cv2.polylines(image, [pts], isClosed=True, color=(255, 255, 0), thickness=3)
# 显示图像
cv2.imshow('Polygon Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(5)画点:
- 使用
cv2.circle
绘制点
函数原型:
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
- img: 输入图像。
- center: 圆心的位置,以 (x, y) 坐标表示。
- radius: 圆的半径。
- color: 圆的颜色,以 BGR 格式表示。
- thickness: 圆的线条粗细。如果设置为
-1
,则填充整个圆。
示例代码:
import cv2
import numpy as np
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 画一个红色的点
cv2.circle(image, (200, 200), 1, (0, 0, 255), 8)
# 显示图像
cv2.imshow('Point Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 使用
cv2.drawMarker
绘制点
函数原型:
cv2.drawMarker(img, position, color[, markerType[, markerSize[, thickness[, line_type]]])
- img: 输入图像。
- position: 点的位置,以 (x, y) 坐标表示。
- color: 点的颜色,以 BGR 格式表示。
- markerType: 点的类型,
cv2.MARKER_CROSS(
十字标记)
或cv2.MARKER_STAR
(星)等。 - markerSize: 点的大小。
- thickness: 点的线条粗细。
- line_type: 点的线条类型。
示例代码:
import cv2
import numpy as np
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 画一个绿色的点
cv2.drawMarker(image, (200, 200), (0, 255, 0), markerType=cv2.MARKER_CROSS, markerSize=10, thickness=2)
# 显示图像
cv2.imshow('Point Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(6)画椭圆:
在 OpenCV 中,可以使用 cv2.ellipse
函数来绘制椭圆。这个函数允许您指定椭圆的中心位置、轴的长度、旋转角度以及起始和结束角度,从而在图像上绘制椭圆或椭圆的一部分。
函数原型:
cv2.ellipse(img, center, axes, angle, startAngle, endAngle,
color[, thickness[, lineType[, shift]]])
参数:
- img: 输入图像。
- center: 椭圆的中心点坐标,以 (x, y) 格式。
- axes: 椭圆的轴长度,以 (width, height) 格式。
- angle: 椭圆的倾斜角度。
- startAngle: 椭圆的起始角度。
- endAngle: 椭圆的结束角度。
- color: 椭圆的颜色,以 BGR 格式。
- thickness: 椭圆线条的粗细。如果设置为
-1
,则填充整个椭圆。 - lineType: 线条的类型,如
cv2.LINE_4
、cv2.LINE_8
等。 - shift: 坐标点的小数点位数。
示例代码:
cv2.ellipse
函数绘制椭圆的示例:
import cv2
import numpy as np
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 绘制一个蓝色椭圆
cv2.ellipse(image, (200, 200), (150, 100), 0, 0, 360, (255, 0, 0), 3)
# 显示图像
cv2.imshow('Ellipse Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(7)画填充多边形:
在 OpenCV 中,可以使用 cv2.fillPoly
函数来填充多边形。这个函数允许您指定多边形的顶点,并将其内部区域填充为指定的颜色。
函数原型:
cv2.fillPoly(img, pts, color)
参数:
- img: 输入图像。
- pts: 多边形的顶点,格式为一个包含顶点数组的列表,其中每个顶点数组是一个形状为
(n, 1, 2)
的 NumPy 数组。 - color: 填充颜色,以 BGR 格式表示。
示例代码:
cv2.fillPoly
函数填充多边形的示例:
import cv2
import numpy as np
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 定义多边形的顶点
# 例如,一个三角形的三个顶点
pts = np.array([[100, 100], [200, 100], [150, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))
# 填充多边形
cv2.fillPoly(image, [pts], (0, 255, 0)) # 使用绿色填充
# 显示图像
cv2.imshow('Filled Polygon', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制更复杂的多边形:
想要填充一个更复杂的多边形,只需添加更多的顶点即可:
# 定义一个更复杂的多边形的顶点
pts = np.array([[100, 100], [200, 100], [250, 200], [100, 250], [50, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))
# 填充多边形
cv2.fillPoly(image, [pts], (255, 0, 0)) # 使用蓝色填充
三、文字绘制:
(1)文字绘制:
在 OpenCV 中,可以使用 cv2.putText
函数在图像上绘制文本。这个函数允许您指定文本字符串、位置、字体、大小、颜色等属性。
函数原型:
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
参数:
- img: 输入图像。
- text: 要绘制的文本字符串。
- org: 文本在图像中的位置(左下角的坐标)。
- fontFace: 字体类型,例如
cv2.FONT_HERSHEY_SIMPLEX
。 - fontScale: 字体缩放因子。
- color: 文本的颜色,以 BGR 格式表示。
- thickness: 文本的线条粗细。
- lineType: 线条的类型,如
cv2.LINE_4
、cv2.LINE_8
等。 - bottomLeftOrigin: 如果设置为
True
,则图像的原点在左下角;如果设置为False
(默认),则原点在左上角。
示例代码:
cv2.putText
函数在图像上绘制文本的示例:
import cv2
import numpy as np
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 在图像上绘制白色文本
cv2.putText(image, 'Hello, OpenCV', (50, 200), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
# 显示图像
cv2.imshow('Text Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
更多字体选项:
OpenCV 提供了多种字体类型,例如:
cv2.FONT_HERSHEY_SIMPLEX
cv2.FONT_HERSHEY_PLAIN
cv2.FONT_HERSHEY_DUPLEX
cv2.FONT_HERSHEY_COMPLEX
cv2.FONT_HERSHEY_TRIPLEX
cv2.FONT_HERSHEY_COMPLEX_SMALL
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
cv2.FONT_HERSHEY_SCRIPT_COMPLEX
文本位置调整:
- 可以调整文本的位置,使其在图像中居中显示:
text_size = cv2.getTextSize('Hello, OpenCV', cv2.FONT_HERSHEY_SIMPLEX, 1, 2)
text_x = (image.shape[1] - text_size[0]) // 2
text_y = (image.shape[0] + text_size[1]) // 2
cv2.putText(image, 'Hello, OpenCV', (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
- 使用
cv2.getTextSize
函数计算文本的尺寸,然后根据图像的尺寸和文本的尺寸计算文本的位置,使其在图像中水平和垂直居中。
(2)绘制中文:
OpenCV 的 cv2.putText
函数默认不支持中文字符,因为它使用的是简单的字体渲染,这些字体通常不包含中文字符集。要在图像上绘制中文文本,需要使用其他库,如 Pillow(PIL)。
(1)安装 Pillow 库。如果没有安装,可以使用 pip 安装:
pip install pillow
(2)代码示例:
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import cv2
# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 创建一个绘图对象
draw = ImageDraw.Draw(pil_image)
# 定义中文字体和大小
font = ImageFont.truetype("simsun.ttc", 24) # simsun.ttc 是 Windows 系统中的宋体字体
# 在图像上绘制中文文本
draw.text((50, 50), "你好,OpenCV", font=font, fill=(255, 255, 255))
# 将 PIL 图像转换回 OpenCV 图像
image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
# 显示图像
cv2.imshow('Chinese Text Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、为图像添加边框:
在 OpenCV 中,为图像添加边框可以使用 cv2.copyMakeBorder
函数。这个函数可以在图像的边缘添加边框,并且可以指定边框的宽度、类型、颜色等。
(1)函数原型:
cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value[, dst[, dstsize[, centerize]]])
(2)参数:
- src: 输入图像。
- top: 图像上方边框的宽度。
- bottom: 图像下方边框的宽度。
- left: 图像左侧边框的宽度。
- right: 图像右侧边框的宽度。
- borderType: 边框的类型,如
cv2.BORDER_CONSTANT
、cv2.BORDER_REPLICATE
等。 - value: 边框的颜色,对于彩色图像,应该是一个包含三个元素的元组(BGR)。
- dst: 输出图像。
- dstsize: 输出图像的大小。
- centerize: 是否将原图像居中。
(3)示例代码:
cv2.copyMakeBorder
函数为图像添加边框的示例:
import cv2
import numpy as np
# 读取一个图像
src = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\faves.png")
# 为图像添加红色边框
border_color = (0, 0, 255) # BGR格式的红色
dst = cv2.copyMakeBorder(src, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=border_color)
# 创建一个足够大的黑色背景图像
image = np.zeros((dst.shape[0] + 100, dst.shape[1] + 100, 3), dtype=np.uint8)
# 将带有边框的图像显示在黑色背景上
image[25:25+dst.shape[0], 25:25+dst.shape[1]] = dst
# 显示图像
cv2.imshow('Image with Border', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
五、在图像中查找轮廓:
在 OpenCV 中,查找图像中的轮廓是一个常见的操作,通常用于图像识别、对象检测和图像分析。轮廓是图像中连续的边缘点的集合,可以用于描述物体的外形。
(1)使用 OpenCV 查找图像轮廓的步骤:
- 转换图像到灰度格式。
- 应用边缘检测(如 Canny 算子)。
- 查找轮廓。
- (可选)绘制轮廓。
(2)示例代码:
import cv2
import numpy as np
# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\faves.png")
# 转换到灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用高斯模糊,减少图像噪声
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 应用 Canny 边缘检测
edges = cv2.Canny(blurred, 50, 150)
# 查找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓(可选)
# 创建一个全黑的图像用于绘制轮廓
contour_image = np.zeros_like(image)
# 绘制所有轮廓
cv2.drawContours(contour_image, contours, -1, (0, 255, 0), 3)
# 显示原始图像和轮廓图像
cv2.imshow('Original Image', image)
cv2.imshow('Contours', contour_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 首先读取一个图像,并将其转换为灰度图像。然后,应用高斯模糊来减少图像噪声,接着使用 Canny 算子进行边缘检测。之后,我们使用
cv2.findContours
函数查找边缘检测结果中的轮廓。最后创建了一个新的图像contour_image
并使用cv2.drawContours
函数在其中绘制轮廓。 - 可以调整 Canny 算子的阈值和高斯模糊的内核大小,以获得最佳的轮廓检测结果。
(3)findContours
函数:
cv2.findContours
是 OpenCV 中一个非常重要的函数,用于检测图像中的轮廓。这个函数可以找到所有连通的边缘点,并将其组织成轮廓列表。
函数原型:
在 OpenCV 3 和 OpenCV 4 中,cv2.findContours
函数的原型略有不同:
对于 OpenCV 3:
cv2.findContours( image, mode, method, contours=None, hierarchy=None )
对于 OpenCV 4:
cv2.findContours( image, mode, contours=None, hierarchy=None, retval=None )
参数:
- image: 输入图像,必须是单通道二值图像(即边缘检测后的图像)。
- mode: 轮廓检索模式,可以是:
cv2.RETR_EXTERNAL
: 只检索最外层的轮廓。cv2.RETR_LIST
: 检索所有轮廓,不建立任何父子关系。cv2.RETR_CCOMP
: 检索所有轮廓,并重建它们的层次结构。cv2.RETR_TREE
: 检索所有轮廓,并重建完整的层次结构。
- method: 轮廓近似方法,可以是:
cv2.CHAIN_APPROX_SIMPLE
: 只保留轮廓的拐点信息。cv2.CHAIN_APPROX_NONE
: 保留轮廓上的所有点。
- contours: 用来存储检测到的轮廓的列表或向量。
- hierarchy: 可选输出参数,包含轮廓的层次信息。
- retval: 可选输出参数,用于存储图像的修改后的版本,其中非零像素表示轮廓。
返回值:
- contours: 检测到的轮廓列表。
- hierarchy: 可选,包含轮廓的层次结构。