图像基本操作很多,这里做个汇总
首先要注意,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)
未完待续...
参考资料: