python中的经典视觉模块:OpenCV(cv2)全面解析

发布于:2025-06-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

1. 前言

2. 图像的读取、显示与保存

3. 图像的基本操作

4. 图像的颜色空间转换

5. 图像的几何变换:对图像进行 “变形” 处理

6. 图像的滤波:给图像 “磨皮” 或 “祛痘”

7. 图像的边缘检测:勾勒出图像的关键轮廓

8. 总结


1. 前言

在数字图像处理和计算机视觉领域,OpenCV 是一个极其强大且被广泛使用的开源库。本文将带大家简单了解 cv2 库中那些最实用、最常用的函数,让大家能粗略运用它们来完成各种基本图像处理任务,开启图像处理之旅。

2. 图像的读取、显示与保存

  • cv2.imread():读取图像文件,把图像带进程序里

    • 语法cv2.imread(filename[, flags])

    • 参数解释

      • filename:图像文件的路径,就像告诉程序 “我要读哪个文件”。

      • flags:决定读取图像的方式。cv2.IMREAD_COLOR 是默认选项,读取彩色图像,只是会忽略透明度信息;cv2.IMREAD_GRAYSCALE 会把图像读成灰度的,只保留明暗信息;cv2.IMREAD_UNCHANGED 则是原汁原味地读取图像,包括透明度通道。

    • 示例代码

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:就是你想显示的图像对应的矩阵对象。

    • 示例代码

# 显示彩色图像
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 文件时,能设置压缩质量。

    • 示例代码

# 保存图像
cv2.imwrite('saved_image.jpg', image)

# 保存灰度图像
cv2.imwrite('saved_gray_image.jpg', gray_image)

3. 图像的基本操作

  • 获取图像属性:知道图像的基本信息

    • 图像的形状 :用 shape 属性,能知道图像的尺寸。彩色图像返回(行数,列数,通道数),灰度图像返回(行数,列数)。

    • 示例代码

# 获取图像形状
print('Image shape:', image.shape)

# 获取灰度图像形状
print('Gray image shape:', gray_image.shape)

图像的数据类型 :用 `dtype` 属性,了解图像像素的类型。
示例代码:

# 获取图像数据类型
print('Image data type:', image.dtype)

图像的大小** :用 `size` 属性,得到图像像素的总数。
示例代码: 

# 获取图像大小
print('Image size:', image.size)
  • 图像通道分离与合并:对图像的色彩通道进行 “手术”

    • cv2.split():把图像的通道分开

    • 示例代码

# 分离彩色图像通道,得到 B(蓝)、G(绿)、R(红)通道
b, g, r = cv2.split(image)

cv2.merge():把单独的通道再合并回去
示例代码:

# 合并通道,得到完整的彩色图像
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:输出图像的通道数。

    • 示例代码

# 将 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:直接指定输出图像的大小,像(宽,高)。

      • fxfy:分别沿 x、y 轴的缩放比例。

      • interpolation:插值方法,cv2.INTER_LINEAR 适合放大图像,cv2.INTER_AREA 适合缩小图像。

    • 示例代码

# 缩小图像
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() 函数实现平移。

    • 示例代码

# 创建平移矩阵,沿 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() 函数完成旋转。

    • 示例代码

# 创建旋转矩阵,以图像中心为旋转中心,旋转 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 坐标。

 图像裁剪:从图像中 “裁” 出需要的部分

  • 借助数组切片操作就行。

    • 示例代码

# 裁剪图像,从 (50,100) 开始,到 (200,300) 结束的区域
cropped_image = image[50:200, 100:300]

6. 图像的滤波:给图像 “磨皮” 或 “祛痘”

  • 均值滤波:简单直接的模糊处理

    • cv2.blur():用均值滤波让图像模糊

    • 语法cv2.blur(src, ksize[, dst[, anchor[, borderType]]])

    • 参数解释

      • src:输入图像。

      • ksize:滤波器大小,像(宽,高)。

    • 示例代码

# 进行均值滤波,用 5x5 的滤波器
blurred_image = cv2.blur(image, (5, 5))
  • 高斯滤波:更自然柔和的模糊效果

    • cv2.GaussianBlur():用高斯滤波实现模糊

    • 语法cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])

    • 参数解释

      • src:输入图像。

      • ksize:高斯核大小。

      • sigmaXsigmaY:分别是 x、y 方向高斯核的标准差。

    • 示例代码

# 进行高斯滤波,用 5x5 的高斯核,x 方向标准差为 0(自动计算)
gaussian_blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
  • 中值滤波:专门对付椒盐噪声

    • cv2.medianBlur():用中值滤波去除噪声

    • 语法cv2.medianBlur(src, ksize)

    • 参数解释

      • src:输入图像。

      • ksize:滤波器大小,要是正奇数

    • 示例代码

# 进行中值滤波,用 5x5 的滤波器
median_blurred_image = cv2.medianBlur(image, 5)
  • 双边滤波:模糊的同时保留边缘细节

    • cv2.bilateralFilter():实现双边滤波

    • 语法cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)

    • 参数解释

      • src:输入图像。

      • d:邻域直径,像素周围的范围。

      • sigmaColorsigmaSpace:分别是颜色空间和坐标空间滤波器的标准差。

    • 示例代码

# 进行双边滤波,领域直径 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:输入图像,要是单通道灰度图。

      • threshold1threshold2:分别是低阈值和高阈值,用于判断哪些边是强边、哪些是弱边。

      • edges:输出的边缘图像。

      • apertureSize:计算图像梯度时 Sobel 算子的孔径大小。

      • L2gradient:布尔值,决定用哪种公式计算图像梯度。

    • 示例代码

# 进行 Canny 边缘检测,低阈值 100,高阈值 200
edges = cv2.Canny(gray_image, 100, 200)

8. 总结

Python 里的 cv2 库,把图像处理和计算机视觉的各种复杂操作都变成了简单的函数调用。从最基础的读取、显示和保存图像,到深入了解图像的各种属性,再到对图像进行颜色空间转换、几何变换、滤波处理以及边缘检测等一系列操作,我们都能借助 cv2 库轻松搞定。在实际项目里,我们完全可以根据自己的需求,把不同的函数灵活搭配组合,去应对各种棘手的图像处理任务。持续深入地学习和实践 cv2 库,还能不断解锁更多图像处理的奇妙招式。我是橙色小博,关注我,一起在人工智能领域学习进步!


网站公告

今日签到

点亮在社区的每一天
去签到