OpenCV 图像处理基础算法详解(一)

文章目录

  1. 图像读取与显示
  2. 图像基本操作
  3. 颜色空间转换
  4. 图像几何变换
  5. 图像算术运算

.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)
  1. 图像基本操作
    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范围的浮点数
  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)
  1. 图像几何变换
    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))
  1. 图像算术运算
    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)
相关推荐
做怪小疯子2 小时前
LeetCode 热题 100——链表——相交链表
算法·leetcode·链表
立志成为大牛的小牛3 小时前
数据结构——五十一、散列表的基本概念(王道408)
开发语言·数据结构·学习·程序人生·算法·散列表
Coovally AI模型快速验证4 小时前
去噪扩散模型,根本不去噪?何恺明新论文回归「去噪」本质
人工智能·深度学习·算法·机器学习·计算机视觉·数据挖掘·回归
歌_顿4 小时前
attention、transform、bert 复习总结 1
人工智能·算法
MicroTech20254 小时前
MLGO微算法科技时空卷积与双重注意机制驱动的脑信号多任务分类算法
科技·算法·分类
txp玩Linux4 小时前
rk3568上解析webrtc音频降噪算法处理流程
算法·音视频·webrtc
立志成为大牛的小牛5 小时前
数据结构——五十二、散列函数的构造(王道408)
数据结构·笔记·程序人生·考研·算法
希望有朝一日能如愿以偿6 小时前
力扣每日一题:可被三整除的最大和
数据结构·算法·leetcode
扶尔魔ocy6 小时前
【QT opencv】手动去噪--网格化获取区域坐标
开发语言·qt·opencv