【总结】OpenCV-Python常用API(五)—— 图像矩阵处理(3)

1. 多通道图像拆分

1.1 函数简述和原型

该函数用于拆分图像的各个通道,结果是一个包含图像所有通道的列表。比如一个BGR彩色图像有三个通道,那么拆分后就返回一个包含蓝色、绿色、红色色彩分量的列表。应注意此时里列表中每个元素只是各个色彩的分量,分别只是一个二维矩阵(即单通道图像),因此如果直接显示出来仍然是灰度图像,越白的地方表示该色彩分量越大。注意及时是单通道灰度图像,返回值仍是一个列表,只是里面只有一个元素。官方文档:https://docs.opencv.org/3.4.2/d2/de8/group__core__array.html#ga0547c7fed86152d7e9d0096029c8518a

mv = cv2.split(m)

1.2 参数

  • m:要拆分的图像数据;

1.3 返回值

  • mv:list类型,其中元素的数量即为图像的通道数,每个元素即为图像单个通道的分量数据,顺序与图像的色彩空间排序一致;

1.4 用法举例

img = cv2.imread(r'.\image.jpg', cv2.IMREAD_COLOR)

# 直接利用Python的序列解包特性获取不同色彩通道的分量矩阵
b, g, r = cv2.split(img)

2. 多通道图像融合

2.1 函数简述和原型

该函数用于将多个单通道分量融合形成多通道图像,作用与split函数相反。官方文档:https://docs.opencv.org/3.4.2/d2/de8/group__core__array.html#ga7d7b4d6c6ee504b30a20b1680029c7b4

dst = cv2.merge(mv)

2.2 参数

  • mv:list类型,每个元素为要进行融合的各个通道,融合后的通道顺序与列表中相同;

2.3 返回值

  • dst:融合后的多通道图像;

2.4 用法举例

此处展示一个将某张BGR彩色图片拆分,并将各个色彩分量融合展示的例子。注意由于拆分后的各色彩分量仍是单通道灰度图像,故为了将各个颜色分量展示为彩色,将其分别与一个同样大小的纯黑色图像矩阵融合,形成三个BGR彩色图像展示:

img = cv2.imread(r'.\image.jpg', cv2.IMREAD_COLOR)

# 拆分图像各个通道分量,注意此时返回的各个分量仍是单通道灰度图像
b, g, r = cv2.split(img)

# 将各个通道分别与纯黑色矩阵融合
black = np.zeros_like(b)
b = cv2.merge((b, black.copy(), black.copy()))
g = cv2.merge((black.copy(), g, black.copy()))
r = cv2.merge((black.copy(), black.copy(), r))

# 彩色展示三个色彩分量
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('r', r)

2.5 实例展示

上述代码生成的图像如下:
通道拆分融合

3. 图像范围选择

3.1 函数简述和原型

该函数用于选择图像矩阵中的值在某个范围内的所有像素,返回一个二值化的矩阵,大小与原图像一致,原图中像素在指定范围内,返回矩阵中对应位置的值为255(白色),否则为0(黑色)。官方文档:https://docs.opencv.org/3.4.2/d2/de8/group__core__array.html#ga48af0ab51e36436c5d04340e036ce981

dst = cv2.inRange(src, lowerb, upperb)

3.2 参数

  • src:要进行范围选择的图像数据;
  • lowerb:范围选择的下限(选择时包含该值),选择单通道灰度图像时是一个值;选择多通道彩色图像时,则是一个n元组或1*n的ndarray,n即为通道数量;
  • upperb:范围选择的上限(选择时包含该值),类型与范围选择下限一致;

3.3 返回值

  • dst:返回大小与原图一致的二值化矩阵,原图某像素的值在所有通道上均满足范围要求,返回矩阵在该处的值才为255,否则即为0;

3.4 用法举例

此处展示一个各种OpenCV教程均会提到的一个例子,就是对彩色图像在HSV色彩空间上进行颜色范围的选择。HSV色彩空间就是在色调(H)、饱和度(S)、明度(V)三个角度定义一个彩色图像。

色调就是将颜色用0-360°的角度度量:红色为0°、绿色为120°、蓝色为240°。但由于OpenCV中存储图像的数据类型为uint8,对应的颜色角度均是除以2保存的,故H通道的值在0-180之间。饱和度在0-255之间,体现了颜色的浓淡,值越小颜色越淡(越接近白色)。明度在0-255之间,体现了颜色的明暗,值越小颜色越暗(越接近黑色)。

下面就是一个在伊布图像中选择紫色部分的例子:

img = cv2.imread(r'.\image.jpg', cv2.IMREAD_COLOR)

# 转换为HSV色彩空间以便进行颜色选择
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 根据颜色范围进行筛选
# 紫色大概为300°,即H在150左右;
# 饱和度不能太低,否则就是白色;
# 明度不能太低,否则就是黑色
lower_purple = (130, 60, 60)
upper_purple = (160, 255, 255)
mask = cv2.inRange(imgHSV, lower_purple, upper_purple)
cv2.imshow("Mask", mask)

# 范围选择返回的二值化图像可以作为掩模,按位与提取原图中的紫色部分
purple_part = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("Purple Region", purple_part)

3.5 实例展示

上述代码生成的图像如下:
色彩范围选择

4. 小结

OpenCV提供的关于图像矩阵的操作还有很多,比如寻找矩阵中最大值cv2.max、最小值cv2.min,计算矩阵所有元素的和cv2.sum等等。但个人认为由于图像的矩阵数据就是numpy.ndarray类型,因此很多矩阵操作使用numpy库的函数灵活度更高、效率也更高。至于numpy对矩阵的各种操作就直接去numpy官网查询API就好了。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值