此系列博客记录 网易云课堂 python + openCV图像处理课程的学习过程。
本篇博客将介绍 获取图像属性、感兴趣区域ROI、通道的拆分与合并 三个部分。
color.jpg
gray.jpg
1、获取图像属性
import cv2
g = cv2.imread(r"C:\workspace\python\openCV\gray.jpg",cv2.IMREAD_UNCHANGED) # 灰度图像,单通道
i = cv2.imread(r"C:\workspace\python\openCV\color.jpg",cv2.IMREAD_UNCHANGED) # BGR图像,三通道
print(g.shape) #结果 (27, 120)
print(i.shape) #结果 (27, 120, 3)
print(g.size) #结果 3240
print(i.size) #结果 9720
print(g.dtype) #结果 uint8
print(i.dtype) #结果 unit8
shape
属性 - 获取图像的形状,返回包含 (行数、列数、通道数) 的元祖
size
属性 - 获取图像的像素数目 = 行数 * 列数 * 通道数
dtype
属性 - 获取图像中像素的类型
2、感兴趣区域ROI
ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域。
import cv2
import numpy as np
a = cv2.imread(r"C:\workspace\python\openCV\color.jpg",cv2.IMREAD_UNCHANGED) # BGR图像,三通道
b = np.ones((27,27,3)) # 新建一个大小为 27 * 27 的BGR图像,默认为黑色(0,0,0)
b[2:10,2:10] = (255,255,255) # 将b中的[2:10,2:10]区域变成白色
a[0:27,0:27] = b # 用 b 图像替换到 a 图像中 [0:27,0:27] 区域
cv2.imshow("demo",b)
cv2.imshow("demo",a)
cv2.waitKey(0)
cv2.destroyAllWindows()
np.ones((27,27,3))
- 实则建立了一个 27 个 27 * 3 的矩阵,不过这里可以表示图像
效果图:
可以看到原图像的 [0:27,0:27] 区域被替换成了 黑色块,且黑色块中 [2:10,2:10] 区域变成了 白色
3、通道的拆分与合并
import cv2
a = cv2.imread(r"C:\workspace\python\openCV\color.jpg",cv2.IMREAD_UNCHANGED) # BGR图像,三通道
b,g,r = cv2.split(a) # 拆分a图像的三个通道
cv2.imshow("original",a)
cv2.imshow("Blue",b)
cv2.imshow("Green",g)
cv2.imshow("Red",r)
m = cv2.merge([b,g,r])# 合并a图形的三个通道
cv2.imshow("result",m)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.merge([b,g,r])
- 合并通道,若BGR的顺序错误,则与原图不同
import cv2
import numpy as np
a = cv2.imread(r"C:\workspace\python\openCV\color.jpg",cv2.IMREAD_UNCHANGED) # BGR图像,三通道
rows,cols,chn = a.shape # 将a图像的行数、列数、通道数 赋值给三个变量
b = cv2.split(a)[0] # 通过下标指定通道
g = np.zeros((rows,cols),a.dtype) # 新建一个 行列数和类型 与 a图像相同的矩阵
r = np.zeros((rows,cols),a.dtype)
m = cv2.merge([b,g,r])# 合并a图形的三个通道
cv2.imshow("result",m)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图: