现在位置: 首页 > OpenCV 教程 > 正文

OpenCV 图像基本操作

本文将详细介绍图像的四种基本操作:访问和修改像素值、图像 ROI (Region of Interest) 操作、图像通道分离与合并、以及图像的缩放、旋转、平移和翻转。

常用方法:

操作函数/方法说明
访问像素值image[y, x]获取或修改像素值。
图像 ROIimage[y1:y2, x1:x2]获取或修改图像中的矩形区域。
通道分离与合并cv2.split() / cv2.merge()分离或合并图像通道。
图像缩放cv2.resize()调整图像大小。
图像旋转cv2.getRotationMatrix2D()旋转图像。
图像平移cv2.warpAffine()平移图像。
图像翻转cv2.flip()翻转图像。
图像加法cv2.add()对两幅图像进行加法运算。
图像减法cv2.subtract()对两幅图像进行减法运算。
图像混合cv2.addWeighted()对两幅图像进行加权混合。
阈值处理cv2.threshold()对图像进行阈值处理。
平滑处理cv2.blur() / cv2.GaussianBlur()对图像进行平滑处理。

1. 访问和修改像素值

图像是由像素组成的矩阵,每个像素都有一个或多个值,表示颜色或灰度。在灰度图像中,每个像素只有一个值,表示灰度强度;在彩色图像中,每个像素通常有三个值,分别表示红色、绿色和蓝色(RGB)通道的强度。

访问像素值

在 Python 中,可以使用 OpenCV 库来访问图像的像素值。假设我们有一个灰度图像 img,可以通过 img[y, x] 来访问位于 (x, y) 位置的像素值。对于彩色图像,可以通过 img[y, x, c] 来访问特定通道 c 的像素值,其中 c 为 0(蓝色)、1(绿色)或 2(红色)。

实例

import cv2

# 读取图像
img = cv2.imread('image.jpg')

# 访问像素值
pixel_value = img[100, 150]  # 访问 (150, 100) 位置的像素值
print(pixel_value)

修改像素值

修改像素值同样简单,只需将新值赋给相应的像素位置即可。

实例

# 修改像素值
img[100, 150] = [255, 255, 255]  # 将 (150, 100) 位置的像素值设置为白色

2. 图像 ROI (Region of Interest) 操作

ROI 是指图像中我们感兴趣的区域。通过提取 ROI,我们可以只对图像的特定部分进行处理,从而提高处理效率。

提取 ROI

在 OpenCV 中,可以通过切片操作来提取 ROI。假设我们想要提取图像中左上角 100x100 像素的区域:

实例

# 提取 ROI
roi = img[0:100, 0:100]

修改 ROI

提取 ROI 后,可以对其进行修改,然后将修改后的 ROI 放回原图像中。

实例

# 修改 ROI
roi[:, :] = [0, 255, 0]  # 将 ROI 区域设置为绿色

# 将修改后的 ROI 放回原图像
img[0:100, 0:100] = roi

3. 图像通道分离与合并

彩色图像通常由多个通道组成,例如 RGB 图像的三个通道。有时我们需要将这些通道分离出来进行单独处理,然后再将它们合并回原图像。

通道分离

在 OpenCV 中,可以使用 cv2.split() 函数将图像的通道分离。

实例

# 通道分离
b, g, r = cv2.split(img)

通道合并

分离后的通道可以使用 cv2.merge() 函数合并回原图像。

实例

# 通道合并
merged_img = cv2.merge([b, g, r])

4. 图像缩放、旋转、平移、翻转

图像的几何变换是图像处理中常见的操作,包括缩放、旋转、平移和翻转。

图像缩放

图像缩放可以通过 cv2.resize() 函数实现。可以指定缩放后的图像尺寸或缩放比例。

实例

# 图像缩放
resized_img = cv2.resize(img, (200, 200))  # 将图像缩放为 200x200 像素

图像旋转

图像旋转可以通过 cv2.getRotationMatrix2D()cv2.warpAffine() 函数实现。需要指定旋转中心和旋转角度。

实例

# 图像旋转
(h, w) = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 45, 1.0)  # 旋转 45 度
rotated_img = cv2.warpAffine(img, M, (w, h))

图像平移

图像平移可以通过 cv2.warpAffine() 函数实现。需要指定平移矩阵。

实例

# 图像平移
M = np.float32([[1, 0, 100], [0, 1, 50]])  # 向右平移 100 像素,向下平移 50 像素
translated_img = cv2.warpAffine(img, M, (w, h))

图像翻转

图像翻转可以通过 cv2.flip() 函数实现。可以指定翻转方向(水平、垂直或两者)。

实例

# 图像翻转
flipped_img = cv2.flip(img, 1)  # 水平翻转