Open CV图像基本操作
- 一、处理单个像素值
- 二、处理单个ROI区域(自选区域)
-
- [提取 ROI](#提取 ROI)
- [修改 ROI](#修改 ROI)
- [三、 处理图像通道](#三、 处理图像通道)
- 四、处理整体
一、处理单个像素值
图像是由像素组成的矩阵,每个像素都有一个或多个值,表示颜色或灰度。在灰度图像中,每个像素只有一个值,表示灰度强度;在彩色图像中,每个像素通常有三个值,分别表示红色、绿色和蓝色(RGB)通道的强度。
访问像素值
假设我们有一个灰度图像 img,可以通过 img[y, x] 来访问位于 (x, y) 位置的像素值。对于彩色图像,可以通过 img[y, x, c] 来访问特定通道 c 的像素值,其中 c 为 0(蓝色)、1(绿色)或 2(红色)。
实例
python
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 访问像素值
pixel_value = img[100, 150] # 访问 (150, 100) 位置的像素值
print(pixel_value)
修改像素值
实例
python
# 修改像素值
img[100, 150] = [255, 255, 255] # 将 (150, 100) 位置的像素值设置为白色
二、处理单个ROI区域(自选区域)
ROI 是指图像中我们感兴趣的区域 (Region of Interest)。通过提取 ROI,我们可以只对图像的特定部分进行处理,从而提高处理效率。
提取 ROI
在 OpenCV 中,可以通过切片操作来提取 ROI。假设我们想要提取图像中左上角 100x100 像素的区域:
实例
python
# 提取 ROI
roi = img[0:100, 0:100]
修改 ROI
提取 ROI 后,可以对其进行修改,然后将修改后的 ROI 放回原图像中。
实例
python
# 修改 ROI
roi[:, :] = [0, 255, 0] # 将 ROI 区域设置为绿色
# 将修改后的 ROI 放回原图像
img[0:100, 0:100] = roi
三、 处理图像通道
彩色图像通常由多个通道组成,例如 RGB 图像的三个通道。有时我们需要将这些通道分离出来进行单独处理,然后再将它们合并回原图像。
通道分离
在 OpenCV 中,可以使用 cv2.split() 函数将图像的通道分离。
实例
python
# 通道分离
import cv2
if __name__ == '__main__':
imgPath = 'D:\Word\keli.jpg'
img = cv2.imread(imgPath)
cv2.imshow('image', img)
b, g, r = cv2.split(img)
# 下面会依次显示r,g,b三张图,每张3秒
cv2.imshow('b', b)
cv2.waitKey(3000)
cv2.imshow('g', g)
cv2.waitKey(3000)
cv2.imshow('r', r)
cv2.waitKey(3000)
# 下面会依次保存r,g,b三张图,不像上面顺序是反的
cv2.imwrite('D:\Word\keli-r.jpg', r)
time.sleep(5)
cv2.imwrite('D:\Word\keli-g.jpg', g)
time.sleep(5)
cv2.imwrite('D:\Word\keli-b.jpg', b)
原图
RGB图
通道合并
分离后的通道可以使用 cv2.merge() 函数合并回原图像。
实例
python
# 通道合并
merged_img = cv2.merge([b, g, r])
四、处理整体
图像的几何变换是图像处理中常见的操作,包括缩放、旋转、平移和翻转。
图像缩放
图像缩放可以通过 cv2.resize() 函数实现。可以指定缩放后的图像尺寸或缩放比例。
实例
python
# 图像缩放
resized_img = cv2.resize(img, (200, 200)) # 将图像缩放为 200x200 像素
图像旋转
图像旋转可以通过 cv2.getRotationMatrix2D() 和 cv2.warpAffine() 函数实现。需要指定旋转中心和旋转角度。
实例
python
# 图像旋转
# 取高和宽
h, w = img.shape[:2]
# 计算旋转中心
center = (int(w/2), int(h/2))
# 得到2维线性变化
M = cv2.getRotationMatrix2D(center, 180, 1)
# 将变化作用到img上
img = cv2.warpAffine(img, M, (w, h))
# 显示
cv2.imshow('img', img)
cv2.waitKey(0)
图像平移
图像平移可以通过 cv2.warpAffine() 函数实现。需要指定平移矩阵。
实例
python
# 图像平移
# 向右平移 100 像素,向下平移 50 像素
M2 = np.float32([[1, 0, 100], [0, 1, 50]])
img = cv2.warpAffine(img, M2, (w, h))
cv2.imshow('img', img)
cv2.waitKey(0)
平移以后空的地方显示黑色背景
图像翻转
图像翻转可以通过 cv2.flip() 函数实现。可以指定翻转方向(水平、垂直或两者)。
实例
python
# 图像翻转
flipped_img = cv2.flip(img, 1) # 水平翻转
计划后面都用这一张原创图练习