python学opencv|读取图像(十五)BGR图像和HSV图像通道合并
【1】引言
前序学习进程中,已经掌握了BGR图像和HSV图像通道拆分的基本技巧,即使用split()函数抓取各个通道的具体数值。具体文章链接为:
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分-CSDN博客
在此基础上我们肯定会想到有拆分就会有合并,这就是本次学习的目的。
【2】官网教程
实现BGR图像和HSV图像通道合并,要调用的函数为:merge()。官网链接为:
OpenCV: Operations on arrays
实际上阅读官网的体验有些云里雾里,所以最佳方案是自己写代码做测试。
【3】代码测试
以拆分学习文章中的代码为基础,增加合并的代码,然后输出图像进行对比,这是测试思路。
【3.1】BGR合并
在pycharm等编辑器中输入下述代码,进行通道数据合并:
# BGR合并
bgrm_image=cv.merge([b,g,r]) #合并BGR通道
bggm_image=cv.merge([b,g,g]) #合并BGG通道
gggm_image=cv.merge([g,g,g]) #合并GGG通道
rgbm_image=cv.merge([r,g,b]) #合并RGB通道
cv.imshow('bgrm', bgrm_image) # 显示BGR通道
cv.imshow('bggm', bggm_image) # 显示BGG通道
cv.imshow('gggm', gggm_image) # 显示GGG通道
cv.imshow('rgbm', rgbm_image) # 显示RGB通道
cv.imwrite('cv-ini-000-save-bgrm.png', bgrm_image) # 保存BGR通道图片
cv.imwrite('cv-ini-000-save-bggm.png', bggm_image) # 保存BGG通道图片
cv.imwrite('cv-ini-000-save-gggm.png', gggm_image) # 保存GGG通道图片
cv.imwrite('cv-ini-000-save-rgbm.png', rgbm_image) # 保存RGB通道图片
使用的原始图片cv-ini-000.png依然为:
图1
运行代码后,我们获得的新组合BGR,BGG,GGG和RGB,对应的图像分别为:
图2 BGR组合图cv-ini-000-save-bgrm.png
图3 BGG组合图cv-ini-000-save-bggm.png
图4 GGG组合图cv-ini-000-save-gggm.png
图5 RGB组合图cv-ini-000-save-rgbm.png
由图4可以发现,GGG组合图和拆分后的G通道图看起来几乎一模一样:
图6 单G通道图像cv-ini-000-save-g.png
不过看图像属性会发现,GGG图像是G图像大小的几乎三倍:
图7 GGG图像是G图像大小的几乎三倍
其实换一个思路:GGG通道是将RB通道的数值都改为G通道数值,所以表象上和单个G通道图像看起开一致,但实际上由于通道数=3,所以图片会更大。
【3.2】HSV合并
在pycharm等编辑器中继续增添下述代码:
# HSV合并
hsvm_image=cv.merge([h,s,v]) #合并HSV通道
hvvm_image=cv.merge([h,v,v]) #合并HVV通道
hhhm_image=cv.merge([h,h,h]) #合并HHH通道
vshm_image=cv.merge([v,s,h]) #合并VSH通道
cv.imshow('hsvm', hsvm_image) # 显示HSV通道
cv.imshow('hvvm', hvvm_image) # 显示HVV通道
cv.imshow('hhhm', hhhm_image) # 显示HHH通道
cv.imshow('vshm', vshm_image) # 显示VSH通道
cv.imwrite('cv-ini-000-save-bgrm.png', hsvm_image) # 保存HSV通道图片
cv.imwrite('cv-ini-000-save-bggm.png', hvvm_image) # 保存HVV通道图片
cv.imwrite('cv-ini-000-save-gggm.png', hhhm_image) # 保存HHH通道图片
cv.imwrite('cv-ini-000-save-rgbm.png', vshm_image) # 保存VSH通道图片
运行代码后,我们获得的新组合HSV,HVV,HHH和VSH,对应的图像分别为:
图8 HSV组合图cv-ini-000-save-hsvm.png
图9 HVV组合图cv-ini-000-save-hvvm.png
图10 HHH组合图cv-ini-000-save-hhhm.png
图11 VSH组合图cv-ini-000-save-vshm.png
和BGR合并类似:三通道的HHH通道图像和单个H通道图像看起开一致,但实际上三通道图片更大。
图12 单H通道图像cv-ini-000-save-h.png
图13 HHH图像是H图像大小的几乎三倍
实际上,综合下来看:合并后的三通道图恢复了原有的表象,三通道的图像明显比单通道要大,不按照BGR和HSV合并的图像,都偏离了原有的模样。
此时的完整代码为:
import cv2 as cv # 引入CV模块
import numpy as np # 引入numpy模块
bgr_image = cv.imread('cv-ini-000.png')
if bgr_image is not None:
cv.imshow('cv-ini-000', bgr_image) # 在屏幕上展示图片
cv.imwrite('cv-ini-000-save.png', bgr_image) # 保存图片
# bgr拆分
b, g, r = cv.split(bgr_image) # bgr拆分
#cv.imshow('B', b) # 显示B通道
#cv.imshow('G', g) # 显示G通道
#cv.imshow('R', r) # 显示R通道
cv.imwrite('cv-ini-000-save-b.png', b) # 保存B通道图片
cv.imwrite('cv-ini-000-save-g.png', g) # 保存G通道图片
cv.imwrite('cv-ini-000-save-r.png', r) # 保存R通道图片
# BGR合并
bgrm_image=cv.merge([b,g,r]) #合并BGR通道
bggm_image=cv.merge([b,g,g]) #合并BGG通道
gggm_image=cv.merge([g,g,g]) #合并GGG通道
rgbm_image=cv.merge([r,g,b]) #合并RGB通道
#cv.imshow('bgrm', bgrm_image) # 显示BGR通道
#cv.imshow('bggm', bggm_image) # 显示BGG通道
#cv.imshow('gggm', gggm_image) # 显示GGG通道
#cv.imshow('rgbm', rgbm_image) # 显示RGB通道
cv.imwrite('cv-ini-000-save-bgrm.png', bgrm_image) # 保存BGR通道图片
cv.imwrite('cv-ini-000-save-bggm.png', bggm_image) # 保存BGG通道图片
cv.imwrite('cv-ini-000-save-gggm.png', gggm_image) # 保存GGG通道图片
cv.imwrite('cv-ini-000-save-rgbm.png', rgbm_image) # 保存RGB通道图片
# BGR转HSV
hsv_image = cv.cvtColor(bgr_image, cv.COLOR_BGR2HSV) # BGR转HSV
#cv.imshow('cv-ini-000-hsv', hsv_image) # 在屏幕上展示图片
cv.imwrite('cv-ini-000-save-hsv.png', hsv_image) # 保存图片
# HSV拆分
h, s, v = cv.split(hsv_image) # HSV拆分
cv.imshow('H', h) # 显示H通道
cv.imshow('S', s) # 显示S通道
cv.imshow('V', v) # 显示V通道
# 保存
cv.imwrite('cv-ini-000-save-h.png', h) # 保存H通道图片
cv.imwrite('cv-ini-000-save-s.png', s) # 保存S通道图片
cv.imwrite('cv-ini-000-save-v.png', v) # 保存V通道图片
# HSV合并
hsvm_image=cv.merge([h,s,v]) #合并HSV通道
hvvm_image=cv.merge([h,v,v]) #合并HVV通道
hhhm_image=cv.merge([h,h,h]) #合并HHH通道
vshm_image=cv.merge([v,s,h]) #合并VSH通道
cv.imshow('hsvm', hsvm_image) # 显示HSV通道
cv.imshow('hvvm', hvvm_image) # 显示HVV通道
cv.imshow('hhhm', hhhm_image) # 显示HHH通道
cv.imshow('vshm', vshm_image) # 显示VSH通道
cv.imwrite('cv-ini-000-save-hsvm.png', hsvm_image) # 保存HSV通道图片
cv.imwrite('cv-ini-000-save-hvvm.png', hvvm_image) # 保存HVV通道图片
cv.imwrite('cv-ini-000-save-hhhm.png', hhhm_image) # 保存HHH通道图片
cv.imwrite('cv-ini-000-save-vshm.png', vshm_image) # 保存VSH通道图片
cv.waitKey() # 不会自动关闭图像
cv.destroyAllWindows() # 释放所有窗口
else:
print("There is no any photo")
【4】代码改写
首此启发,我们也许可以探索一下强制合并BGR和HSV,看看有没有新的效果。
继续在pycharm中增加下述代码:
#BGR&HSV组合
hsrm_image=cv.merge([h,s,r]) #合并HSR通道
bvgm_image=cv.merge([b,v,r]) #合并BVR通道
hgsm_image=cv.merge([h,g,s]) #合并HGS通道
cv.imshow('hsrm', hsrm_image) # 显示HSR通道
cv.imshow('bvgm', bvgm_image) # 显示BVG通道
cv.imshow('hgsm', hgsm_image) # 显示HGS通道
cv.imwrite('cv-ini-000-save-hsrm.png', hsrm_image) # 保存HSR通道图片
cv.imwrite('cv-ini-000-save-bvgm.png', bvgm_image) # 保存BVG通道图片
cv.imwrite('cv-ini-000-save-hgsm.png', hgsm_image) # 保存HGS通道图片
运行代码后,获得的HSR、BVG和HGS图像为:
图14 HSR组合图cv-ini-000-save-hsrm.png
图15 BVG组合图cv-ini-000-save-bvgm.png
图16 HGS组合图cv-ini-000-save-hgsm.png
由图可见,BVG组合比较接近真实图像,但和原图相比,主体颜色已经偏绿色,可能是G通道的缘故。
【5】总结
对BGR图和HSV图进行了通道组合,掌握了cv2.merge()函数的基本操作技巧。
实践发现:
三通道图像要比单通道图像大;
BGR和HSV通道也能互相组合。