python学opencv|读取图像(十五)BGR图像和HSV图像通道合并

server/2024/12/22 14:49:34/

【1】引言

前序学习进程中,已经掌握了BGR图像和HSV图像通道拆分的基本技巧,即使用split()函数抓取各个通道的具体数值。具体文章链接为:

pythonopencv|读取图像(十四)BGR图像和HSV图像通道拆分-CSDN博客

在此基础上我们肯定会想到有拆分就会有合并,这就是本次学习的目的。

【2】官网教程

实现BGR图像和HSV图像通道合并,要调用的函数为:merge()。官网链接为:

OpenCV: Operations on arrays

实际上阅读官网的体验有些云里雾里,所以最佳方案是自己写代码做测试。

【3】代码测试

以拆分学习文章中的代码为基础,增加合并的代码,然后输出图像进行对比,这是测试思路。

【3.1】BGR合并

在pycharm等编辑器中输入下述代码,进行通道数据合并:

python">    # 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等编辑器中继续增添下述代码:

python">    # 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合并的图像,都偏离了原有的模样。

此时的完整代码为:

python">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转HSVhsv_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中增加下述代码:

python">#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通道也能互相组合。

 

 


http://www.ppmy.cn/server/152248.html

相关文章

ECharts柱状图-柱图38,附视频讲解与代码下载

引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个柱状图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供…

YOLOv9-0.1部分代码阅读笔记-downloads.py

downloads.py utils\downloads.py 目录 downloads.py 1.所需的库和模块 2.def is_url(url, checkTrue): 3.def gsutil_getsize(url): 4.def url_getsize(urlhttps://ultralytics.com/images/bus.jpg): 5.def safe_download(file, url, url2None, min_bytes1E0, erro…

36.5 自定义指标接入prometheus-operator

prometheus-operator优势总结 自定义的采集配置接入更方便,只要定义serviceMonitor即可采集的参数修改也很方便,对比之前只能由prometheus管理员修改job段配置告警配置也是 prometheus-operator劣势总结 数据的长期存储没有解决高可用性和扩展性没解决…

Linux文件属性 --- 查看修改日期、时间、时区,查看日历

1.查看日期 使用date 命令可以显示或设置系统的时间或日期 ,下面为比较常用的参数列举。 date [参数] [日期格式] 写法功能描述date显示当前时间date %Y显示当前年份date %m显示当前月份date %d显示当前天数%H小时(00~23)%I小时(…

Unity Runtime控制编辑器的一些操作

运行时修改Game窗口尺寸 //设置竖屏 public void ChangePortrait() {Assembly assembly typeof(UnityEditor.EditorWindow).Assembly;Type type assembly.GetType("UnityEditor.GameView");var gameView UnityEditor.EditorWindow.GetWindow(type);//可以反射出其他…

蓝桥杯 2024 国 B【选数概率】(AC)

题目描述 一个数组中有 a a a 个 1 1 1, b b b 个 2 2 2, c c c 个 3 3 3。设 P i , j P_{i,j} Pi,j​ 表示在数组中随机选取两个数,其中一个数为 i i i,另一个数为 j j j 的概率。比如 P 1 , 2 a b C ( a b c , 2 ) …

使用JUnit进行集成测试

在软件开发中,集成测试是一个非常重要的环节。 它可以确保不同模块之间的协作正确性,同时也可以发现系统的潜在问题。 JUnit是一个流行的Java测试框架,它可以帮助我们编写和运行各种类型的测试,包括单元测试和集成测试。 本文将…

如何高效调试复杂布局?Layout Inspector 的 Toggle Deep Inspect 完全解析

Layout Inspector 是 Android Studio 提供的一个强大工具,用于分析和调试 Android 应用的 UI 布局。前置条件是app是debug调试状态,它允许你在应用运行时实时查看布局层次结构、UI 元素的属性,并帮助你诊断 UI 渲染问题。 Toggle Deep Inspe…