1.1. 图片基本操作
1.1.1. 图片读取
使用 cv2.imread()
函数可以读取图片文件。OpenCV 默认以 BGR 格式读取彩色图像。
python">import cv2# 读取图片
image = cv2.imread("example.jpg") # 读取彩色图像
# image = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE) # 读取灰度图像
# image = cv2.imread("example.jpg", cv2.IMREAD_UNCHANGED) # 读取包含透明通道的图像if image is None:print("Error: Could not read the image.")
else:print("Image loaded successfully.")
1.1.2. 图片显示
使用 cv2.imshow()
函数可以显示图片。
python">cv2.imshow("Image", image) # 显示图片
cv2.waitKey(0) # 等待用户按键(0 表示无限等待)
cv2.destroyAllWindows() # 关闭所有窗口
使用 matplotlib.pyplot
- 功能:
matplotlib.pyplot
是一个强大的绘图库,可以用来显示图像,并支持更多的绘图功能。 - 适用场景:
-
- 适用于需要在 Jupyter Notebook 或其他支持
matplotlib
的环境中显示图像的情况。 - 适用于需要对图像进行更复杂的可视化(如添加标题、坐标轴、注释等)的情况。
- 适用于需要在 Jupyter Notebook 或其他支持
python">import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread("image.jpg")# 显示图像
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Image")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()
两者差异:
matplotlib.pyplot:
- 所属库:
matplotlib
是一个强大的绘图库,广泛用于数据可视化。 - 特点:
-
- 主要用于绘制图表、图形和图像,支持丰富的绘图功能。
- 支持显示多种类型的图像,包括灰度图、彩色图等。
- 可以添加标题、坐标轴、注释等。
- 适合在 Jupyter Notebook 或其他支持
matplotlib
的环境中使用。
- 适用场景:
-
- 数据分析和可视化。
- 在 Jupyter Notebook 中快速显示图像。
- 需要对图像进行标注、绘制图形或与其他数据可视化内容结合。
cv2.imshow:
- 所属库:
OpenCV
是一个专注于计算机视觉和图像处理的库。 - 特点:
-
- 专门用于显示图像,支持实时显示和处理。
- 提供了简单的窗口管理功能,如调整窗口大小、移动窗口等。
- 支持键盘和鼠标事件,方便与用户交互。
- 适合在本地运行的脚本中使用。
- 适用场景:
-
- 图像处理和计算机视觉任务。
- 实时显示图像处理结果。
- 需要与用户交互(如按键退出、鼠标点击等)。
结论:如果需要用户交互则用cv2.imshow(),如果需要标注坐标系则用matlpltlib.pyplot
1.1.3. 图片保存
使用 cv2.imwrite()
函数可以将处理后的图像保存到文件。
python">cv2.imwrite("output.jpg", image) # 保存图像
print("Image saved successfully.")
1.1.4. 图片属性获取
可以获取图片的尺寸、通道数、数据类型等信息。
不同格式shpe信息有所差异
BGR/RGB格式的 shape为(Height,Width,Channels)
灰度图像的shape为(Height,Width)
python">height, width = image.shape[:2] # 获取图像的高和宽
print(f"Height: {height}, Width: {width}")if len(image.shape) == 3: # 彩色图像channels = image.shape[2]print(f"Channels: {channels}")
else: # 灰度图像print("Channels: 1")print(f"Data type: {image.dtype}")
1.1.5. 图片大小调整
- 调整大小:使用
cv2.resize()
改变图像尺寸,放大缩小与裁剪不同。
python">resized_image = cv2.resize(image, (800, 600)) # 调整为固定尺寸
# resized_image = cv2.resize(image, None, fx=0.5, fy=0.5) # 按比例缩放
1.1.6. 图片裁剪
- 裁剪:在上一节了解到图片是保存在Numpy数组中故通过 NumPy 的切片操作实现。
python">cropped_image = image[100:500, 200:700] # 裁剪图像 高100-500 宽200-700的区域
1.1.7. 图片旋转
- 旋转:
-
- 使用
cv2.rotate()
- 使用
-
-
- 用于以 90 度的倍数旋转图像。该函数使用
rotateCode
参数以三种不同的方式旋转图像。cv2.rotate()
函数有两个主要的参数:src
和rotateCode
。其中,src
是输入图像(源图像),它是一个 NumPy 数组。rotateCode
是旋转的类型,指定旋转的方向和角度。常见的值包括:
- 用于以 90 度的倍数旋转图像。该函数使用
-
-
-
-
cv2.ROTATE_90_CLOCKWISE
:顺时针旋转 90 度。cv2.ROTATE_180
:旋转 180 度。cv2.ROTATE_90_COUNTERCLOCKWISE
:逆时针旋转 90 度。
-
-
python">import cv2# 读取图片
img = cv2.imread('wechat.jpg')
# 修改图片大小(可选)
img = cv2.resize(img, dsize=None, fx=0.3, fy=0.3)rotated_image = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 顺时针90度
rotated_image1 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) # 逆时针90度
rotated_image2 = cv2.rotate(img, cv2.ROTATE_180) # 旋转180度# 显示图片
cv2.imshow('shun90', rotated_image)
cv2.imshow('ni90', rotated_image1)
cv2.imshow('180', rotated_image2)# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
-
- 自定义旋转矩阵。
-
-
- 计算旋转矩阵:cv2.getRotationMatrix2D
-
-
-
-
- 使用
cv2.getRotationMatrix2D
计算旋转矩阵,参数分别是旋转中心、旋转角度和缩放因子(这里为 1.0,表示不缩放)。
- 使用
-
-
-
-
- 应用旋转矩阵:cv2.warpAffine
-
-
-
-
- 使用
cv2.warpAffine
应用旋转矩阵到图像上,参数分别是输入图像、旋转矩阵和输出图像的尺寸。
- 使用
-
-
python">import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg')angle = 45 # 旋转 45 度# 获取图像尺寸
(height, width) = image.shape[:2]# 计算旋转中心 整除
center = (width // 2, height // 2) # 计算旋转矩阵 旋转中心,旋转角,缩放比例1.0表示不变
rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)# 应用旋转 图片源,旋转矩阵,目标尺寸
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))# 显示原始图像和旋转后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Rotated Image', rotated_image)# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
1.1.8. 图片翻转
- 翻转:使用
cv2.flip()
,可以实现三种翻转如下:
python">flipped_image = cv2.flip(image, 1) # 水平翻转
# flipped_image = cv2.flip(image, 0) # 垂直翻转
# flipped_image = cv2.flip(image, -1) # 水平垂直翻转
1.2. 图像的基本处理
1.2.1. 灰度化
- 介绍:图像的灰度化是图像处理中一种常见的预处理技术,它将彩色图像转换为灰度图像。灰度图像只有一个亮度通道,通常表示为从黑到白的灰度值。
- 灰度化:使用
cv2.cvtColor()
将彩图转换为灰度图。 - 功能及应用场景:
-
- 简化数据
彩色图像通常包含三个通道(如 RGB 或 BGR),而灰度图像只有一个通道。灰度化可以显著减少数据量,简化后续处理步骤。 - 降低计算复杂度
由于灰度图像的数据量较少,处理灰度图像通常比处理彩色图像更快,计算复杂度更低。这对于需要实时处理的应用(如视频分析、实时监控等)尤为重要。 - 特征提取
在许多计算机视觉任务中,如边缘检测、纹理分析等,灰度图像已经足够提取有用的特征。灰度化可以去除颜色信息,使算法专注于亮度和对比度等特征。 - 兼容性
某些图像处理算法和库可能只支持灰度图像。将彩色图像转换为灰度图像可以提高算法的兼容性。 - 提高算法性能
在某些情况下,灰度图像可以提高算法的性能和准确性。例如,在人脸识别中,灰度图像可以减少颜色变化带来的干扰,提高识别率。 - 数据增强
在机器学习和深度学习中,灰度化可以作为一种数据增强技术,增加模型的泛化能力。 - 艺术效果
在艺术和设计领域,灰度图像可以产生独特的视觉效果,如复古风格、高对比度等。
- 简化数据
python">gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
1.2.2. 颜色通道分离与合并:
- 水印嵌入:在图像水印嵌入中,可以分别在每个颜色通道中嵌入水印,以提高水印的鲁棒性。
python"># b, g, r = cv2.split(image) # 分离通道
# merged_image = cv2.merge([b, g, r]) # 合并通道import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread("Cat.jpg")# 分离通道
b, g, r = cv2.split(image)# 显示原始图像
plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Image")
plt.axis("off")# 显示蓝色通道
plt.subplot(2, 2, 2)
plt.imshow(b, cmap='gray')
plt.title("Blue Channel")
plt.axis("off")# 显示绿色通道
plt.subplot(2, 2, 3)
plt.imshow(g, cmap='gray')
plt.title("Green Channel")
plt.axis("off")# 显示红色通道
plt.subplot(2, 2, 4)
plt.imshow(r, cmap='gray')
plt.title("Red Channel")
plt.axis("off")# 合并通道 注意顺序为BGR
merged_image = cv2.merge([b, g, r])# 显示合并后的图像
plt.figure(figsize=(6, 6))
plt.imshow(cv2.cvtColor(merged_image, cv2.COLOR_BGR2RGB))
plt.title("Merged Image")
plt.axis("off")plt.show()