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.mzph.cn/diannao/64566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【进阶编程】MVC和MVVM实现前后端分离的实现

在 WPF 开发中,通常使用 MVVM(Model-View-ViewModel)架构来分离视图和业务逻辑,但在某些情况下,你可能希望将 MVC(Model-View-Controller)模式与 MVVM 结合使用。这种结合有时是为了兼顾不同的架…

CEF127 编译指南 MacOS 篇 - 编译 CEF(六)

1. 引言 经过前面的准备工作,我们已经完成了所有必要的环境配置。本文将详细介绍如何在 macOS 系统上编译 CEF127。通过正确的编译命令和参数配置,我们将完成 CEF 的构建工作,最终生成可用的二进制文件。 2. 编译前准备 2.1 确认环境变量 …

关于小程序内嵌h5打开新的小程序

关于小程序内嵌h5打开新的小程序 三种方式 https://juejin.cn/post/7055551463489011749 只依赖于h5本身的就是 https://huaweicloud.csdn.net/64f97ebb6b896f66024ca16c.html https://juejin.cn/post/7055551463489011749 navigateToMiniProgram 故小程序webview里的h5无法…

网络安全技术深度解析与实践案例

网络安全技术深度解析与实践案例 随着信息技术的飞速发展,计算机网络已经成为现代社会不可或缺的一部分。无论是个人生活、企业运营还是国家安全,网络都扮演着至关重要的角色。然而,网络空间的开放性和匿名性也带来了诸多安全隐患。因此&…

[一招过] Python的正则表达式篇

Python 正则表达式(re模块) 正则表达式(regular expression)是用于匹配字符串的一种强大工具。Python 提供了 re 模块来处理正则表达式。通过正则表达式,可以快速匹配、查找、替换、分割字符串等。 1. re 模块基础 …

Zerotier + VSCode远程连接实验室的服务器、Xshell连接远程服务器

目录 1. 本地安装 Zerotier2. 使用本地CMD或者Xshell连接服务器:3. VSCode连接服务器 1. 本地安装 Zerotier Zerotier用来创建一个虚拟网络,可以将服务器和本机都加入该虚拟网络中。本地将会拥有一个内网ip地址,和服务器在一个网络下&#x…

gcd 生成4d

目录 推理示例: 开源地址 https://github.com/basilevh/gcd 推理示例: This section is for casually running our model on custom videos. For thorough quantitative evaluation on Kubric-4D or ParallelDomain-4D, or any command line inference outside of those t…

网安入门|前端基础之Html_css基础

Web1.0、Web2.0 和 Web3.0 是互联网发展的三个主要阶段,每个阶段有其独特的特征和技术进步。以下是对它们的介绍: Web 1.0(静态互联网) 时间:1990年代初到2000年代初 特点: 静态内容:网页主要…

开发平台接口规范:北斗终端->北斗三号卫星->指挥机(北斗终端)->北斗短报文融合平台->客户平台(上行)| 时空信息产品

文章目录 引言I 技术架构和业务流程技术架构北斗终端信息流II 渠道接口验证签名白名单IP渠道配置表设计III 其他辅助功能TCP 发送消息到消息中心nginx转发网关服务异常捕获日志采集IV 知识扩展对请求参数进行校验引言 开发平台的应用场景:平台需要开发能力给下游平台需要接收上…

知识分享第三十天-力扣343.(整数拆分)

343 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你可…

C语言中回调函数的注册及使用

1&#xff0c;回调函数类型定义 #include <stdio.h>// 定义回调函数类型 typedef void (*CallbackFunction)(int); 2&#xff0c;定义注册和调用回调函数的函数 // 存储回调函数的数组 CallbackFunction callbacks[10]; int callback_count 0;// 注册回调函数 void r…

SQL Server 解决游标性能问题的替代方案

在 SQL Server 中&#xff0c;游标&#xff08;Cursor&#xff09;是一种用于逐行处理数据集的强大工具&#xff0c;但在某些情况下&#xff0c;它们可能会导致性能问题&#xff0c;尤其是在处理大量数据时。为了提高性能和可维护性&#xff0c;可以考虑使用其他替代方案。以下…

Vue3路由跳转动画引发页面抖动问题的解决方案

在现代Web应用中&#xff0c;动画不仅提升了视觉效果&#xff0c;还显著改善了用户体验。Vue3作为前端框架的佼佼者&#xff0c;以其强大的生态和灵活的API为开发者提供了丰富的动画实现方式。然而&#xff0c;在Vue3中为路由跳转增加动画效果时&#xff0c;开发者可能会遇到页…

【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.

一、web服 1)账号注册 // 用于唯一命名服务 com.xinyue.game.center.business.account.logic.AccountRegisterService#accountRegister public void accountRegister(AccountEntity account) {accountManager.checkUsername(account.getUsername());accountManager.checkPass…

搭建Tomcat(六)---Response的实现

目录 引入 一、前端项目容器的搭建 重建项目: 1.创建一个新的项目&#xff1a; 2.创建HTML文件 3.将先前编写的所有tomcatJava文件挪过来 二、配置java文件 1.重启一下MyTomcat 2.配置两个工具包 ①FileUtil ②ResponseUtil&#xff08;响应头&#xff09; 三、处理…

机械鹦鹉与真正的智能:大语言模型推理能力的迷思

编者按&#xff1a; 大语言模型真的具备推理能力吗&#xff1f;我们是否误解了"智能"的本质&#xff0c;将模式匹配误认为是真正的推理&#xff1f; 本文深入探讨了大语言模型&#xff08;LLMs&#xff09;是否真正具备推理能力这一前沿科学问题&#xff0c;作者的核…

.net winform 实现CSS3.0 泼墨画效果

效果图 代码 private unsafe void BlendImages1(Bitmap img1, Bitmap img2) {// 确定两个图像的重叠区域Rectangle rect new Rectangle(0, 0,Math.Min(img1.Width, img2.Width),Math.Min(img1.Height, img2.Height));// 创建输出图像&#xff0c;尺寸为重叠区域大小Bitmap b…

VUE+Node.js+mysq实现响应式个人博客|项目初始化+路由配置+基础组件搭建

Day 1 开发文档&#xff1a;项目初始化与基础架构搭建 一、项目初始化 1. 创建项目 首先&#xff0c;我们使用 Vite 创建一个基于 Vue 3 的项目&#xff1a; # 创建项目 npm create vitelatest my-blog -- --template vue # 这条命令会创建一个名为 my-blog 的新项目&#…

短视频矩阵:构建多平台曝光的高效运营网络

在当今这个瞬息万变的数字化时代&#xff0c;短视频以其独特的魅力迅速占领了人们的视野&#xff0c;成为信息传播与娱乐消遣的重要一环。随着短视频平台的不断增多和用户群体的日益庞大&#xff0c;如何精准高效地利用短视频进行品牌推广和产品营销&#xff0c;成为了众多企业…

ubuntu+ros新手笔记(三):21讲没讲到的MoveIt2

系统ubuntu22.04 ros2 humble 1 安装MoveIt2 安装参照在ROS2中&#xff0c;通过MoveIt2控制Gazebo中的自定义机械手 安装 MoveIt2可以选择自己编译源码安装&#xff0c;或者直接从二进制安装。 个人建议直接二进制安装&#xff0c;可以省很多事。 sudo apt install ros-humbl…