OpenCV4【4】- 图像基本操作

图像基本操作很多,这里做个汇总

首先要注意,opencv 中像素通道顺序为 BGR,与我们常说的 RGB 刚好相反。

首先准备一张图片,可创建新图像,也可读取已存在的图像

img = np.zeros(shape=(300, 300, 3), dtype=np.uint8)
cv.namedWindow('t')
cv.imshow('t', img)

获取图像属性

## 行、列、通道数
# 如果是彩色图,返回 行、列、通道数;如果是灰度图,返回 行、列
print(img.shape)        # (300, 300, 3)

## 像素总数
print(img.size)         # 270000

## 数据类型
# img.dtype在调试时非常重要,因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的
print(img.dtype)        # uint8

获取和修改像素

# 对于 BGR 图像,它返回一个由蓝色、绿色和红色值组成的数组。对于灰度图像,只返回相应的灰度
px = img[100, 100, 0]       # 获取
print(px)                   # 0

img[100: 200, 100: 200, :3] = np.random.randint(0, 255, size=[100, 100, 3], dtype=np.uint8)      # 修改
cv.imshow('t', img)
cv.waitKey(0)

获取感兴趣区域 ROI

这里主要了解 ROI 概念,其实就是 获取图像某部分

roi = img[100: 150, 100: 150, : 3]        # 获取 roi
img[200: 250, 200: 250, : 3] = roi        # 移动 roi
cv.imshow('t', img)
cv.waitKey(0)

拆分 和 合并 通道

## 拆分:把 b g r 拆分开,合并:把 一个 通道 合并到 某个图像
# 拆分
b, g, r = cv.split(img)
# 合并
img2 = cv.merge((b, b, b))
cv.imshow('t', img2)
cv.waitKey(0)

cv.split()是一项耗时的操作(就时间而言)。因此,仅在必要时才这样做。否则请进行Numpy索引

设置边框 和 填充

# def copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None):
constant= cv.copyMakeBorder(img, 10, 20, 30, 10, cv.BORDER_CONSTANT, value=[255, 0, 0])
cv.imshow('t', constant)
cv.waitKey(0)

未完待续...

参考资料:

原文地址:https://www.cnblogs.com/yanshw/p/15378900.html