Python视觉模块OpenCV(cv2)功能全面解析与详解

目录

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 库,还能不断解锁更多图像处理的奇妙招式。我是橙色小博,关注我,一起在人工智能领域学习进步!

    作者:橙色小博

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python视觉模块OpenCV(cv2)功能全面解析与详解

    发表回复