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

python学opencv|读取图像(十六)修改HSV图像HSV值

【1】引言

前序学习进程中,我们已经掌握了对HSV通道和BGR通道的拆分和合并,并通过自由组合的形式,获得了和初始图像完全不一样的新图像,相关文章可以参考下述链接:

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

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

在此基础上,我们掌握了如何抓取各个通道的具体值,自然地,我们会想到修改各个通道的具体值。

在更早的时候,其实我们已经掌握了如何修改BGR图像各个通道的值,并获得了灰度和彩色图像,相关链接包括且不限于下述:
python学opencv|读取图像(六)读取图像像素RGB值_opencv读取灰度图-CSDN博客

python学opencv|读取图像(八)用numpy创建纯黑灰度图-CSDN博客

python学opencv|读取图像(十)用numpy创建彩色图像-CSDN博客

【2】代码测试

在前述基础上,我们本次课程直接对HSV图像进行通道设定。

【2.1】BGR转HSV

第一步,将BGR图像转化为HSV图像,在pycharm等编辑器中输入以下代码:

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转HSVhsv_image = cv.cvtColor(bgr_image, cv.COLOR_BGR2HSV)  # BGR转HSVcv.imshow('cv-ini-000-hsv', hsv_image)  # 在屏幕上展示图片cv.imwrite('cv-ini-000-save-hsv.png', hsv_image)  # 保存图片cv.waitKey()  # 不会自动关闭图像cv.destroyAllWindows()  # 释放所有窗口
else:print("There is no any photo")

使用的cv-ini-000.bng图像为:

12d90e58f55743d49b2a4d156d07496c.png

图1 cv-ini-000.bng

转换后的HSV图像为:

aab33249c31a4a5b92d82040ac3e5a42.png

图2 cv-ini-000-save-hsv.png

【2.2】HSV通道拆分

在获得HSV图像基础上,对HSV的通道进行拆分。

在pycharm等编辑器中补充下述代码:

    h,s,v=cv.split(hsv_image) #HSV拆分cv.imshow('H', h)  # 显示H通道cv.imwrite('cv-ini-000-save-hsv-h.png', h)  # 保存图片

这部分代码的意思是,先将BGR图转化的HSV图拆分为HSV三个通道,然后把H通道图像输出在屏幕上:

be15b54aff6c40b0846603d9b549f3b1.png

图3  cv-ini-000-save-hsv-h.png

然后把H通道数值强行转化为160。在此之前,我们梳理一下HSV的取值范围:

色调H:光的颜色,取值范围[0,180];

饱和度S:色彩的深浅,取值范围[0,255];

亮度V:光的明暗,取值范围[0,255]。

然后我们继续输入下述代码:

    h[:,:]=160 #强制H通道取值=160cv.imshow('H=160', h)  # 显示H通道cv.imwrite('cv-ini-000-save-hsv-h=160.png', h)  # 保存图片

运行后,获得的cv-ini-000-save-hsv-h=160.png图像为:

b457ef17916442518fad017e22f26197.png

图4 cv-ini-000-save-hsv-h=160.png

因为是单通道图像,所以是纯色,这个图像是符合预期的。

【2.3】HSV通道合并

然后我们再把通道合并,看看效果,继续输入下述代码:

    h160svm_image=cv.merge([h,s,v]) #合并HSV通道cv.imshow('H=160SV', h160svm_image)  # 显示合并图像cv.imwrite('cv-ini-000-save-hsv-h=160sv.png', h160svm_image)  # 保存图片

运行后的图像为:

4676964c632448fc9c1d95f06abadcf5.png

图5 cv-ini-000-save-hsv-h=160sv.png

图5和图2不同,根本原因就在于图5中的H=180。

出于好奇,我们读取一下特定点的HSV值,来对比图5和图2的这种不同。继续补充下述代码:

    print('hsv_image[100,100]=',hsv_image[100,100]) #读取原hsv_image图像的HSV值print('h160svm_image[100,100]=',h160svm_image[100,100]) #读取H=160后的h160sv_image图像的HSV值print('hsv_image[600,800]=', hsv_image[600, 800])  # 读取原hsv_image图像的HSV值print('h160svm_image[600,800]=', h160svm_image[600, 800])  # 读取H=160后的h160sv_image图像的HSV值

运行后的输出为:

8c92f43094d34c0caf61b1301cf4da01.png

图6 HSV值读取

由图6可见,确实是H通道的值在约束H值以后,每一个像素点都有H=160。

设置SV通道值得方法类似,不再赘述。

至此的完整代码为:

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转HSVhsv_image = cv.cvtColor(bgr_image, cv.COLOR_BGR2HSV)  # BGR转HSVcv.imshow('cv-ini-000-hsv', hsv_image)  # 在屏幕上展示图片cv.imwrite('cv-ini-000-save-hsv.png', hsv_image)  # 保存图片h,s,v=cv.split(hsv_image) #HSV拆分cv.imshow('H', h)  # 显示H通道cv.imwrite('cv-ini-000-save-hsv-h.png', h)  # 保存图片h[:,:]=160 #强制H通道取值=160cv.imshow('H=160', h)  # 显示H通道cv.imwrite('cv-ini-000-save-hsv-h=160.png', h)  # 保存图片h160svm_image=cv.merge([h,s,v]) #合并HSV通道cv.imshow('H=160SV', h160svm_image)  # 显示合并图像cv.imwrite('cv-ini-000-save-hsv-h=160sv.png', h160svm_image)  # 保存图片print('hsv_image[100,100]=',hsv_image[100,100]) #读取原hsv_image图像的HSV值print('h160svm_image[100,100]=',h160svm_image[100,100]) #读取H=160后的h160sv_image图像的HSV值print('hsv_image[600,800]=', hsv_image[600, 800])  # 读取原hsv_image图像的HSV值print('h160svm_image[600,800]=', h160svm_image[600, 800])  # 读取H=160后的h160sv_image图像的HSV值cv.waitKey()  # 不会自动关闭图像cv.destroyAllWindows()  # 释放所有窗口
else:print("There is no any photo")

【3】总结

掌握了设置HSV图像HSV值的技巧。

 

 

 

 

 

 

 

 


http://www.mrgr.cn/news/80758.html

相关文章:

  • Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
  • EasyPlayer.js播放器Web播放H.265要兼顾哪些方面?
  • Spring基础分析08-集成JPA/Hibernate进行ORM操作
  • MyBatis的常用节点(标签)
  • nodejs搭配express网站开发后端接口设计需要注意事项
  • 【Python装饰器】添加一个检测对象类型是否正确的装饰器
  • 管理系统、微信小程序类源码文档-哔哩哔哩教程同步
  • 西游记战力排名、笔记等
  • pro文件转换为CMakeLists.txt文件,QT官方工具使用教程
  • 【云原生】Docker Compose 从入门到实战使用详解
  • 唯品会C++面试题及参考答案
  • FreeMarker语法
  • Restaurants WebAPI(二)——DTO/CQRS
  • 17.springcloud_openfeign之扩展组件一
  • 2024.12.19总结
  • SamOut 推理空间不变模型解析
  • [SZ901]程序固化工具速度对比
  • 【Maven】基础(一)
  • 排序算法深度好文(图解 + 代码解析 + 误区 QA )——学排序看这一篇就够了!!!
  • 洛谷P3879 [TJOI2010] 阅读理解(c嘎嘎)
  • 【CSS in Depth 2 精译_085】14.2:CSS 蒙版的用法
  • 无刷电机的概念
  • Linux:进程通信、管道通信
  • PYQT5程序框架
  • Go-FastDFS文件服务器一镜到底使用Docker安装
  • 【AI图像生成网站Golang】项目架构