目录
[1. 前言](#1. 前言)
[2. 图像的读取、显示与保存](#2. 图像的读取、显示与保存)
[3. 图像的基本操作](#3. 图像的基本操作)
[4. 图像的颜色空间转换](#4. 图像的颜色空间转换)
[5. 图像的几何变换:对图像进行 "变形" 处理](#5. 图像的几何变换:对图像进行 “变形” 处理)
[6. 图像的滤波:给图像 "磨皮" 或 "祛痘"](#6. 图像的滤波:给图像 “磨皮” 或 “祛痘”)
[7. 图像的边缘检测:勾勒出图像的关键轮廓](#7. 图像的边缘检测:勾勒出图像的关键轮廓)
[8. 总结](#8. 总结)
1. 前言
在数字图像处理和计算机视觉领域,OpenCV 是一个极其强大且被广泛使用的开源库。本文将带大家简单了解 cv2 库中那些最实用、最常用的函数,让大家能粗略运用它们来完成各种基本图像处理任务,开启图像处理之旅。
2. 图像的读取、显示与保存
-
cv2.imread():读取图像文件,把图像带进程序里
-
语法 :
cv2.imread(filename[, flags])
-
参数解释 :
-
filename
:图像文件的路径,就像告诉程序 "我要读哪个文件"。 -
flags
:决定读取图像的方式。cv2.IMREAD_COLOR
是默认选项,读取彩色图像,只是会忽略透明度信息;cv2.IMREAD_GRAYSCALE
会把图像读成灰度的,只保留明暗信息;cv2.IMREAD_UNCHANGED
则是原汁原味地读取图像,包括透明度通道。
-
-
示例代码 :
-
python
import cv2
# 读取彩色图像
image = cv2.imread('image.jpg', cv2.IMREAD_COLOR)
# 读取灰度图像
gray_image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
-
cv2.imshow():把图像展示出来,让你能看到读取的效果
-
语法 :
cv2.imshow(winname, mat)
-
参数解释 :
-
winname
:给显示图像的窗口起个名字,方便识别。 -
mat
:就是你想显示的图像对应的矩阵对象。
-
-
示例代码 :
-
python
# 显示彩色图像
cv2.imshow('Colored Image', image)
# 显示灰度图像
cv2.imshow('Gray Image', gray_image)
# 等待用户按键事件,让窗口能停留展示图像
cv2.waitKey(0)
# 关闭所有创建的窗口,防止资源占用
cv2.destroyAllWindows()
-
cv2.imwrite():把处理好的图像保存下来,留存结果
-
语法 :
cv2.imwrite(filename, img[, params])
-
参数解释 :
-
filename
:保存图像的文件名,包括路径和扩展名,比如存到哪个文件夹、用什么格式(.jpg、.png 等)保存。 -
img
:要保存的图像对应的矩阵。 -
params
:可以指定一些编码参数,像保存 JPEG 文件时,能设置压缩质量。
-
-
示例代码 :
-
python
# 保存图像
cv2.imwrite('saved_image.jpg', image)
# 保存灰度图像
cv2.imwrite('saved_gray_image.jpg', gray_image)
3. 图像的基本操作
-
获取图像属性:知道图像的基本信息
-
图像的形状 :用
shape
属性,能知道图像的尺寸。彩色图像返回(行数,列数,通道数),灰度图像返回(行数,列数)。 -
示例代码 :
-
python
# 获取图像形状
print('Image shape:', image.shape)
# 获取灰度图像形状
print('Gray image shape:', gray_image.shape)
图像的数据类型 :用 `dtype` 属性,了解图像像素的类型。
示例代码:
python
# 获取图像数据类型
print('Image data type:', image.dtype)
图像的大小** :用 `size` 属性,得到图像像素的总数。
示例代码:
python
# 获取图像大小
print('Image size:', image.size)
-
图像通道分离与合并:对图像的色彩通道进行 "手术"
-
cv2.split():把图像的通道分开
-
示例代码 :
-
python
# 分离彩色图像通道,得到 B(蓝)、G(绿)、R(红)通道
b, g, r = cv2.split(image)
cv2.merge():把单独的通道再合并回去
示例代码:
python
# 合并通道,得到完整的彩色图像
merged_image = cv2.merge([b, g, r])
4. 图像的颜色空间转换
-
cv2.cvtColor():实现颜色空间的转换
-
语法 :
cv2.cvtColor(src, code[, dst[, dstCn]])
-
参数解释 :
-
src
:输入图像。 -
code
:转换的规则代码,比如cv2.COLOR_BGR2GRAY
是把 BGR 转为灰度,cv2.COLOR_BGR2HSV
是转为 HSV 色彩模式。 -
dst
:输出图像。 -
dstCn
:输出图像的通道数。
-
-
示例代码 :
-
python
# 将 BGR 转换为灰度
gray_image2 = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 将 BGR 转换为 HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
5. 图像的几何变换:对图像进行 "变形" 处理
-
图像缩放:把图像放大或缩小
-
cv2.resize():调整图像大小
-
语法 :
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
-
参数解释 :
-
src
:输入图像。 -
dsize
:直接指定输出图像的大小,像(宽,高)。 -
fx
和fy
:分别沿 x、y 轴的缩放比例。 -
interpolation
:插值方法,cv2.INTER_LINEAR
适合放大图像,cv2.INTER_AREA
适合缩小图像。
-
-
示例代码 :
-
python
# 缩小图像
resized_image_small = cv2.resize(image, (300, 200), interpolation=cv2.INTER_AREA)
# 放大图像
resized_image_large = cv2.resize(image, (800, 600), interpolation=cv2.INTER_LINEAR)
-
图像平移:把图像在平面上 "挪个位置"
-
先构造平移矩阵,二维平移矩阵长这样: 然后调用
cv2.warpAffine()
函数实现平移。 -
示例代码 :
-
python
# 创建平移矩阵,沿 x 轴平移 50 像素,沿 y 轴平移 100 像素
tx = 50
ty = 100
translation_matrix = np.array([[1, 0, tx],
[0, 1, ty]], dtype=np.float32)
# 进行平移操作
translated_image = cv2.warpAffine(image, translation_matrix, (image.shape[1], image.shape[0]))
-
图像旋转:让图像 "转个身"
-
先用
cv2.getRotationMatrix2D()
函数构造旋转矩阵。 -
语法 :
cv2.getRotationMatrix2D(center, angle, scale)
-
参数解释 :
-
center
:旋转围绕的中心点坐标。 -
angle
:旋转角度,正数代表逆时针转。 -
scale
:旋转时的缩放比例,1.0 表示不缩放。
-
-
再用
cv2.warpAffine()
函数完成旋转。 -
示例代码 :
-
python
# 创建旋转矩阵,以图像中心为旋转中心,旋转 45 度,不缩放
center = (image.shape[1] // 2, image.shape[0] // 2)
angle = 45
scale = 1.0
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
# 进行旋转操作
rotated_image = cv2.warpAffine(image, rotation_matrix, (image.shape[1], image.shape[0]))
当我们想取图像的中心点作为旋转中心时,正确的写法是 center = (image.shape[1] // 2, image.shape[0] // 2)
,而不是 center = (image.shape[0] // 2, image.shape[1] // 2)
,原因如下:
-
image.shape[1]
得到的是图像的宽度(即列数),对应 x 轴方向的尺寸,所以用它除以 2 得到图像中心在 x 轴方向的坐标,也就是中心点的 x 坐标。 -
image.shape[0]
得到的是图像的高度(即行数),对应 y 轴方向的尺寸,所以用它除以 2 得到图像中心在 y 轴方向的坐标,也就是中心点的 y 坐标。
图像裁剪:从图像中 "裁" 出需要的部分
-
借助数组切片操作就行。
- 示例代码 :
python
# 裁剪图像,从 (50,100) 开始,到 (200,300) 结束的区域
cropped_image = image[50:200, 100:300]
6. 图像的滤波:给图像 "磨皮" 或 "祛痘"
-
均值滤波:简单直接的模糊处理
-
cv2.blur():用均值滤波让图像模糊
-
语法 :
cv2.blur(src, ksize[, dst[, anchor[, borderType]]])
-
参数解释 :
-
src
:输入图像。 -
ksize
:滤波器大小,像(宽,高)。
-
-
示例代码 :
-
python
# 进行均值滤波,用 5x5 的滤波器
blurred_image = cv2.blur(image, (5, 5))
-
高斯滤波:更自然柔和的模糊效果
-
cv2.GaussianBlur():用高斯滤波实现模糊
-
语法 :
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
-
参数解释 :
-
src
:输入图像。 -
ksize
:高斯核大小。 -
sigmaX
和sigmaY
:分别是 x、y 方向高斯核的标准差。
-
-
示例代码 :
-
python
# 进行高斯滤波,用 5x5 的高斯核,x 方向标准差为 0(自动计算)
gaussian_blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
-
中值滤波:专门对付椒盐噪声
-
cv2.medianBlur():用中值滤波去除噪声
-
语法 :
cv2.medianBlur(src, ksize)
-
参数解释 :
-
src
:输入图像。 -
ksize
:滤波器大小,要是++正奇数++。
-
-
示例代码 :
-
python
# 进行中值滤波,用 5x5 的滤波器
median_blurred_image = cv2.medianBlur(image, 5)
-
双边滤波:模糊的同时保留边缘细节
-
cv2.bilateralFilter():实现双边滤波
-
语法 :
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
-
参数解释 :
-
src
:输入图像。 -
d
:邻域直径,像素周围的范围。 -
sigmaColor
和sigmaSpace
:分别是颜色空间和坐标空间滤波器的标准差。
-
-
示例代码 :
-
python
# 进行双边滤波,领域直径 9,颜色空间标准差 75,坐标空间标准差 75
bilateral_filtered_image = cv2.bilateralFilter(image, 9, 75, 75)
7. 图像的边缘检测:勾勒出图像的关键轮廓
-
Canny 边缘检测:精准找出图像的边界线
-
cv2.Canny():用 Canny 算法检测边缘
-
语法 :
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
-
参数解释 :
-
image
:输入图像,要是单通道灰度图。 -
threshold1
和threshold2
:分别是低阈值和高阈值,用于判断哪些边是强边、哪些是弱边。 -
edges
:输出的边缘图像。 -
apertureSize
:计算图像梯度时 Sobel 算子的孔径大小。 -
L2gradient
:布尔值,决定用哪种公式计算图像梯度。
-
-
示例代码 :
-
python
# 进行 Canny 边缘检测,低阈值 100,高阈值 200
edges = cv2.Canny(gray_image, 100, 200)
8. 总结
Python 里的 cv2 库,把图像处理和计算机视觉的各种复杂操作都变成了简单的函数调用。从最基础的读取、显示和保存图像,到深入了解图像的各种属性,再到对图像进行颜色空间转换、几何变换、滤波处理以及边缘检测等一系列操作,我们都能借助 cv2 库轻松搞定。在实际项目里,我们完全可以根据自己的需求,把不同的函数灵活搭配组合,去应对各种棘手的图像处理任务。持续深入地学习和实践 cv2 库,还能不断解锁更多图像处理的奇妙招式。我是橙色小博,关注我,一起在人工智能领域学习进步!