文章目录
- 图像读取与显示
- 图像基本操作
- 颜色空间转换
- 图像几何变换
- 图像算术运算
.1. 图像读取与显示
1.1 图像读取模式
python
import cv2
import numpy as np
# 不同模式的图像读取
img_color = cv2.imread('image.jpg', cv2.IMREAD_COLOR) # 彩色图像 (默认)
img_grayscale = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 灰度图像
img_unchanged = cv2.imread('image.jpg', cv2.IMREAD_UNCHANGED) # 包含alpha通道
print(f"彩色图像形状: {img_color.shape}") # (高度, 宽度, 通道数)
print(f"灰度图像形状: {img_grayscale.shape}") # (高度, 宽度)
1.2 图像显示与保存
python
# 显示图像
cv2.imshow('Color Image', img_color)
cv2.imshow('Grayscale Image', img_grayscale)
# 等待按键
key = cv2.waitKey(0) # 0表示无限等待
if key == 27: # ESC键
cv2.destroyAllWindows()
elif key == ord('s'): # 's'键保存
cv2.imwrite('saved_image.jpg', img_color)
# 创建窗口并调整大小
cv2.namedWindow('Resizable Window', cv2.WINDOW_NORMAL)
cv2.imshow('Resizable Window', img_color)
- 图像基本操作
2.1 像素访问与修改
python
# 访问单个像素值
pixel_value = img_color[100, 100] # 位置(y,x)处的BGR值
print(f"BGR值: {pixel_value}")
# 修改像素值
img_color[100, 100] = [255, 255, 255] # 设置为白色
# ROI (Region of Interest) 操作
roi = img_color[100:200, 100:200] # 提取ROI
img_color[300:400, 300:400] = roi # 复制ROI到其他位置
# 更好的像素访问方式(使用numpy数组操作)
for i in range(100, 200):
for j in range(100, 200):
img_color[i, j] = [0, 0, 255] # 设置为红色
2.2 图像属性
python
# 获取图像属性
print(f"图像形状: {img_color.shape}")
print(f"图像大小: {img_color.size}") # 总像素数
print(f"图像数据类型: {img_color.dtype}")
print(f"图像维度: {img_color.ndim}")
# 图像数据类型转换
img_float = img_color.astype(np.float32) / 255.0 # 转换为0-1范围的浮点数
- 颜色空间转换
3.1 常用颜色空间
python
# BGR 转 灰度
gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
# BGR 转 HSV (色调、饱和度、明度)
hsv = cv2.cvtColor(img_color, cv2.COLOR_BGR2HSV)
# BGR 转 LAB (亮度、A、B颜色分量)
lab = cv2.cvtColor(img_color, cv2.COLOR_BGR2LAB)
# BGR 转 YCrCb (亮度、红色差、蓝色差)
ycrgb = cv2.cvtColor(img_color, cv2.COLOR_BGR2YCrCb)
# 反向转换
img_bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
3.2 颜色空间应用示例
python
# HSV颜色空间中的颜色过滤
lower_red = np.array([0, 120, 70])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([170, 120, 70])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
# 合并红色范围的mask
red_mask = mask1 + mask2
# 应用mask
red_objects = cv2.bitwise_and(img_color, img_color, mask=red_mask)
- 图像几何变换
4.1 缩放
python
# 指定尺寸缩放
resized = cv2.resize(img_color, (300, 200)) # (宽度, 高度)
# 按比例缩放
scale_percent = 50 # 缩放50%
width = int(img_color.shape[1] * scale_percent / 100)
height = int(img_color.shape[0] * scale_percent / 100)
resized_proportional = cv2.resize(img_color, (width, height))
# 不同的插值方法
resized_nearest = cv2.resize(img_color, (300, 200), interpolation=cv2.INTER_NEAREST)
resized_linear = cv2.resize(img_color, (300, 200), interpolation=cv2.INTER_LINEAR)
resized_cubic = cv2.resize(img_color, (300, 200), interpolation=cv2.INTER_CUBIC)
4.2 平移
python
# 定义平移矩阵 [1, 0, tx], [0, 1, ty]
tx, ty = 100, 50 # 向右100像素,向下50像素
M = np.float32([[1, 0, tx], [0, 1, ty]])
rows, cols = img_color.shape[:2]
# 应用平移变换
translated = cv2.warpAffine(img_color, M, (cols, rows))
4.3 旋转
python
# 获取图像中心
center = (cols // 2, rows // 2)
# 旋转45度,缩放因子1.0
angle = 45
scale = 1.0
M = cv2.getRotationMatrix2D(center, angle, scale)
# 应用旋转变换
rotated = cv2.warpAffine(img_color, M, (cols, rows))
# 计算旋转后的图像边界,避免裁剪
def rotate_image(image, angle):
height, width = image.shape[:2]
center = (width // 2, height // 2)
# 获取旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, 1.0)
# 计算新的图像尺寸
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
new_width = int((height * sin) + (width * cos))
new_height = int((height * cos) + (width * sin))
# 调整旋转矩阵的平移分量
M[0, 2] += (new_width / 2) - center[0]
M[1, 2] += (new_height / 2) - center[1]
return cv2.warpAffine(image, M, (new_width, new_height))
rotated_full = rotate_image(img_color, 30)
4.4 仿射变换
python
# 三个点对定义仿射变换
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])
M = cv2.getAffineTransform(pts1, pts2)
affine = cv2.warpAffine(img_color, M, (cols, rows))
4.5 透视变换
python
# 四个点对定义透视变换
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
M = cv2.getPerspectiveTransform(pts1, pts2)
perspective = cv2.warpPerspective(img_color, M, (300, 300))
- 图像算术运算
5.1 基本算术运算
python
# 图像加法
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
add_result = cv2.add(img1, img2) # 饱和加法
# 图像加权加法(混合)
alpha = 0.7 # img1的权重
beta = 0.3 # img2的权重
blended = cv2.addWeighted(img1, alpha, img2, beta, 0) # gamma = 0
# 图像减法
subtract_result = cv2.subtract(img1, img2)
# 图像乘法(亮度调整)
multiplied = cv2.multiply(img1, 1.5) # 亮度增加50%
# 图像除法
divided = cv2.divide(img1, 2) # 亮度减少50%
5.2 位运算
python
# 创建矩形和圆形mask
rectangle_mask = np.zeros(img_color.shape[:2], dtype=np.uint8)
cv2.rectangle(rectangle_mask, (50, 50), (200, 200), 255, -1)
circle_mask = np.zeros(img_color.shape[:2], dtype=np.uint8)
cv2.circle(circle_mask, (125, 125), 75, 255, -1)
# 位运算
mask_and = cv2.bitwise_and(rectangle_mask, circle_mask)
mask_or = cv2.bitwise_or(rectangle_mask, circle_mask)
mask_xor = cv2.bitwise_xor(rectangle_mask, circle_mask)
mask_not = cv2.bitwise_not(rectangle_mask)
# 应用mask到图像
masked_image = cv2.bitwise_and(img_color, img_color, mask=mask_and)