python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入

【1】引言

前序学习过程中,我们偶然发现:如果原始图像是png格式,将其从BGR转向HSV,再从HSV转回BGR后,图像的效果要好于JPG格式。

文章链接为:

python学opencv|读取图像(十二)BGR图像转HSV图像-CSDN博客

但之前“BGR转向HSV,再从HSV转回BGR”的过程分别写了两个程序。

在此实践基础上,我们尝试在同一个程序内部实现BGR-HSV-BGR的闭环转换。

【2】代码编写

在前述文章的基础上,我们在pycharm等编辑器输入下述代码:

import cv2 as cv  # 引入cv2模块
import numpy as np

image = cv.imread("cv-BGR-000.png")  # 读取图片
if image is not None:  # 成功读取图片
    cv.imshow('cvtest', image)  # 显示为彩色图

    # BGR向HSV转化
    hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)  # BGR和HSV转化
    image_bh = np.hstack((image, hsv_image))  # BGR和HSV图像拼接
    cv.imshow('hcvtest', image_bh)  # 显示为拼接图
    cv.imwrite('cv-BGRTOHSV-001.png', hsv_image)  # 保存HSV图
    cv.imwrite('cv-BGRTOHSV-002.png', image_bh)  # 保存BGR和HSV图像拼接

    # HSV向BGR转化
    bgr_image=cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR)  # BGR和HSV转化
    image_hb = np.hstack((hsv_image, bgr_image))  # BGR和HSV图像拼接
    cv.imshow('bgrtest', image_hb)  # 显示为拼接图
    cv.imwrite('cv-HSVTOBGR-001.png', bgr_image)  # 保存BGR图
    cv.imwrite('cv-HSVTOBGR-002.png', image_hb)  # 保存BGR和HSV图像拼接

    cv.waitKey()  # 图片显示时间
    cv.destroyAllWindows()  # 释放所有窗口
else:  # 未找到图片
    print("Error: 图片无法加载")

代码看起来很长,但实际上可以大致分为三个模块:

第一个模块引入cv2和numpy模块;

第二个模块包括两部分,第一部分实现BGR向HSV转换,第二部分实现HSV向BGR转换;

第三个模块释放所有对象。

【3】代码测试

运行代码前,我们准备的原始图像cv-BGR-000.png为:

图1 cv-BGR-000.png

运行代码后,获得的BGR转HSV图为cv-BGRTOHSV-001.png。

cv-BGRTOHSV-001.png和原cv-BGR-000.png对比效果为:

图2 cv-BGR-000.png和cv-BGRTOHSV-001.png对比

显然,在BGR转向HSV图像后,HSV图像似乎染上了很多红晕。

代码继续运行,获得的HSV转回的BGR图为cv-HSVTOBGR-001.png。

cv-HSVTOBGR-001.png和原cv-BGRTOHSV-001.png对比效果为:

图3 cv-BGRTOHSV-001和cv-HSVTOBGR-001.png对比

此时我们发现:由HSV转回BGR后的图像,似乎和原图完全一致。

【4】图像对比

为实现上述猜想,于是继续增添代码,将BGR-HSV-BGR的图像和原图进行对比:

# HSV向BGR转化后和原图对比
image_bhb = np.hstack((image, bgr_image))  # HSV转回BGR图像和原图拼接
cv.imshow('bgrhsvbgrtest', image_bhb)  # 显示为拼接图
cv.imwrite('cv-BGRTOHSVTOBGR.png', image_bhb)  # 保存BGR图

代码运行后的效果为:

图4 cv-BGRTOHSVTOBGR.png

由图4可见,基于png格式图像的BGR-HSV-BGR的闭环转换,图像几乎是无损的回到了原来的模样。

此时我们还会发现,转回的新图比原图还大:

图5 转回的新图比原图还大

上述发现有助于大家在实际工作生活中进行灵活转换图像。

此时的完整代码为:

import cv2 as cv  # 引入cv2模块
import numpy as np

image = cv.imread("cv-BGR-000.png")  # 读取图片
if image is not None:  # 成功读取图片
    cv.imshow('cvtest', image)  # 显示为彩色图

    # BGR向HSV转化
    hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)  # BGR和HSV转化
    image_bh = np.hstack((image, hsv_image))  # BGR和HSV图像拼接
    cv.imshow('hcvtest', image_bh)  # 显示为拼接图
    cv.imwrite('cv-BGRTOHSV-001.png', hsv_image)  # 保存HSV图
    cv.imwrite('cv-BGRTOHSV-002.png', image_bh)  # 保存BGR和HSV图像拼接

    # HSV向BGR转化
    bgr_image=cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR)  # BGR和HSV转化
    image_hb = np.hstack((hsv_image, bgr_image))  # BGR和HSV图像拼接
    cv.imshow('bgrtest', image_hb)  # 显示为拼接图
    cv.imwrite('cv-HSVTOBGR-001.png', bgr_image)  # 保存BGR图
    cv.imwrite('cv-HSVTOBGR-002.png', image_hb)  # 保存BGR和HSV图像拼接

    # HSV向BGR转化后和原图对比
    image_bhb = np.hstack((image, bgr_image))  # HSV转回BGR图像和原图拼接
    cv.imshow('bgrhsvbgrtest', image_bhb)  # 显示为拼接图
    cv.imwrite('cv-BGRTOHSVTOBGR.png', image_bhb)  # 保存BGR图

    cv.waitKey()  # 图片显示时间
    cv.destroyAllWindows()  # 释放所有窗口
else:  # 未找到图片
    print("Error: 图片无法加载")

 【5】总结

探索了png格式的图像,进行BGR-HSV-BGR格式比转换后的对比,发现新图比原图质量更高。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python | 数据可视化中常见的4种标注及示例

在Python的数据可视化中,标注(Annotation)技术是一种非常有用的工具,它可以帮助用户更准确地解释图表中的数据和模式。在本文中,将带您了解使用Python实现数据可视化时应该了解的4种标注。 常见的标注方式 文本标注箭…

【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章

文章目录 线性代数入门:机器学习零基础小白指南前言一、向量:数据的基本单元1.1 什么是向量?1.1.1 举个例子: 1.2 向量的表示与维度1.2.1 向量的维度1.2.2 向量的表示方法 1.3 向量的基本运算1.3.1 向量加法1.3.2 向量的数乘1.3.3…

基于 JNI + Rust 实现一种高性能 Excel 导出方案(下篇)

衡量一个人是否幸福,不应看他有多少高兴的事,而应看他是否为小事烦扰。只有幸福的人,才会把无关痛痒的小事挂心上。那些真正经历巨大灾难和深重痛苦的人,根本无暇顾及这些小事的。因此人们往往在失去幸福之后,才会发现…

Cesium中实现仿ArcGIS三维的动态图层加载方式

Cesium 加载 ArcGIS 动态图层的方式 如果你在 Cesium 中加载过 ArcGIS 的动态图层,你会发现,Cesium 对于动态图层仍然采用类似切片图层的逻辑进行加载。也就是每个固定的瓦片 export 一张图片。 这样会造成一些问题: 请求量大,…

信号处理:概念、技术、领域

目录 基本概念 主要技术 应用领域 信号处理是一个涉及分析、修改和再生信号的多学科领域。信号可以是各种形式的,例如声音、图像、视频或其他类型的监测数据。信号处理的主要目标是提取有用的信息并增强信号的质量。以下是信号处理的一些基本概念和应用&#xff…

【Redis】Redis 生成唯一 id

每个订单业务都需要有一个唯一的id,如果使用数据库自增id就会暴露规律,同时id会有一个最大的阈值,万一订单超过这个阈值,那就会出现问题。因此我们可以封装一个全局ID生成器,可以适用于分布式系统生成唯一ID&#xff0…

购物商城案例 -- VueCli创建项目,调整目录,vant组件库

基于VueCli创建项目 调整目录,新增两个目录 修改路由和App.vue 路由中规则清空 新建文件夹api和utils api文件夹:发请求的一些文件 utils文件夹:工具函数方法 vant组件库:第三方vue组件库 vant-ui 找到vant官网,进入va…

金融分析-Transformer模型(基础理论)

Transformer模型 1.基本原理 transformer的core是注意力机制,其本质就是编码器-解码器。他可以通过多个编码器进行编码,再把编码完的结果输出给解码器进行解码,然后得到最终的output。 1.1编码器 数据在编码器中会经过一个self-attention的…

【密码学】AES算法

一、AES算法介绍: AES(Advanced Encryption Standard)算法是一种广泛使用的对称密钥加密,由美国国家标准与技术研究院(NIST)于2001年发布。 AES是一种分组密码,支持128位、192位和256位三种不同…

朗致面试---IOS/安卓/Java/架构师

朗致面试---IOS/安卓/Java/架构师 一、面试概况二、总结三、算法题目参考答案 一、面试概况 一共三轮面试: 第一轮是逻辑行测,25道题目,类似于公务员考试题目,要求90分钟内完成。第二轮是技术面试,主要是做一些数据结…

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…

网络原理done

文章目录 ARP协议模拟一次ARP过程ARP周边问题ARP欺骗RARP DNS域名解析服务域名简介DNS结论 ICMP协议 NAT技术(重点)NAPTNAT缺点 内网穿透代理服务器正向代理反向代理 NAT和代理服务器区别 ARP协议 以这片区域为例 此时IP报文到达入口路由器R 此时路由器…

MATLAB中Simulink的信号线

Simulink以模块为最小单位,通过信号线互相连接,用户可通过GUI调配每个模块的参数,且仿真的结果能够以数值和图像等形象化方式具现出来。信号线可以传递一维数据、多维数据、向量数据或矩阵数据,甚至Bus型数据。Simulink使用不同的线形表示传递不同数据类型的信号线,…

集成方案 | Docusign + 泛微,实现全流程电子化签署!

本文将详细介绍 Docusign 与泛微的集成步骤及其效果,并通过实际应用场景来展示 Docusign 的强大集成能力,以证明 Docusign 集成功能的高效性和实用性。 在现代企业运营中,效率和合规性是至关重要的。泛微作为企业级办公自动化和流程管理的解决…

基于vue的quasarui框架和.NET CORE实现网站

首先安装quasar cli,然后进行配置 前台代码部分截图 后台部分截图 数据库 网站部分

一行代码解决vue3前端打包部署到服务器,动态配置http请求头后端ip方法教程无bug

只需要一行代码 vue3若依框架前端打包部署到服务器,需要部署到多个服务器上,每次打包会很麻烦,今天教大家一个简单的动态配置请求头api的方法,部署后能动态获取(修改)对应服务器的请求ip, 介绍两种方法,如…

openGauss开源数据库实战二十三

文章目录 任务二十三 openGauss 参数管理任务目标实施步骤一、启动参数文件及参数类型1.参数值修改后必须重新启动数据库的参数2.参数值修改后只需要reload操作的参数 二、设置数据库级参数三、设置用户级参数四、设置会话级参数五、将参数设置为默认值 任务二十三 openGauss 参…

杨振宁大学物理视频中黄色的字,c#写程序去掉(原版改进,三)

上一节,我们分清了主次矛盾,并搞定了主要矛盾(去掉黄色的字),这一节解决次要矛盾(矩形色带)。 我们的想法如图: 1,我们找到稳定黄色的最左边,最右边两点&…

ORACLE逗号分隔的字符串字段,关联表查询

使用场景如下: oracle12 以前的写法: selectt.pro_ids,wm_concat(t1.name) pro_names from info t,product t1 where instr(,||t.pro_ids|| ,,,|| t1.id|| ,) > 0 group by pro_ids oracle12 以后的写法: selectt.pro_ids,listagg(DIS…

JS-手写new

我们先再来理一理原型 Object1 {name:deng,age:18 } Object2 {name:ru,age:18 } const Person function(){} Person.prototype Object1; const p1 new Person(); console.log(p1.name); //deng Person.prototype null; console.log(p1.name); //deng上面给Person的构造函…