当前位置: 首页 > news >正文

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 npimage = 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 npimage = 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格式比转换后的对比,发现新图比原图质量更高。

 

http://www.lryc.cn/news/504029.html

相关文章:

  • 【鸿蒙实战开发】数据的下拉刷新与上拉加载
  • 面向对象设计规则和各类设计模式
  • 《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(六)
  • 利用Docker分层构建优化镜像大小
  • Spring 魔法探秘:从 Bean 线程安全到事务魔法全解析
  • [Maven]IDEA父工程创建子工程后父工程不可运行
  • 【系统移植】在开发板上加载内核和根文件系统的三种方法
  • #渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍02-基于错误消息的SQL注入(Error-Based SQL Injection)
  • 数据结构-排序(来自于王道)
  • 【蓝桥杯选拔赛真题93】Scratch青蛙过河 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析
  • ReactPress最佳实践—搭建导航网站实战
  • Hive-4.0.1数据库搭建(可选配置用户名密码远程连接)
  • P8772 求和 P8716 回文日期
  • MySQL迁移SQLite
  • RocketMQ中的顺序消息和乱序消息详解
  • Unity UGUI图片循环列表插件
  • Kafka系列教程 - Kafka 生产者 -2
  • AI Chat API 对接说明
  • Thread线程基础使用
  • 【Linux】结构化命令
  • ElasticSearch01-概述
  • docker xxxx is using its referenced image ea06665f255d
  • Vue 2 中 v-text 和 v-html 指令的使用详解
  • 高级Python游戏开发:创建一款多人对战坦克大战
  • 数据结构_拓扑排序
  • Edge SCDN 边缘安全加速有什么用?
  • 被狗咬住怎么让它松口?
  • MySQL迁移SQLite 借助PYTHON脚本
  • Python什么是动态调用方法?What is Dynamic Method Invocation? (中英双语)
  • Cesium中实现仿ArcGIS三维的动态图层加载方式