HSV算法及其改进 (附代码)

news2025/2/25 11:11:50

1.HSV

HSV是一种颜色空间,它由色相(Hue)、饱和度(Saturation)和明度(Value)三个参数组成。HSV模型中,色相表示颜色的种类,饱和度表示颜色的纯度,明度表示颜色的亮度。HSV模型常用于图像处理领域,特别是在颜色识别和跟踪方面。

代码

import cv2

# 读取原图像
img = cv2.imread("example.jpg")

# 将RGB图像转换为HSV图像
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 显示原图像和HSV图像
cv2.imshow("Original Image", img)
cv2.imshow("HSV Image", img_hsv)
cv2.waitKey(0)

结果

2.HSL

HSL是一种颜色模型,它代表了颜色的三个属性:色相(Hue)、饱和度(Saturation)和亮度(Lightness)。其中,色相表示颜色的种类,饱和度表示颜色的纯度,亮度表示颜色的明暗程度。HSL模型通常用于图形软件中,用于调整和控制颜色的属性。

代码

import cv2

# 读取图像
img = cv2.imread(r'D:\papercode\experiment\2\deep-learning-for-image-processing-master\deep-learning-for-image-processing-master\amusement_0037.jpg')

# 将图像转换为HSL颜色空间
hsl_img = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)

# 获取色相滑块的值
hue_value = 90

# 调整色相属性
hsl_img[:, :, 0] = hue_value

# 将图像转换回BGR颜色空间
result_img = cv2.cvtColor(hsl_img, cv2.COLOR_HLS2BGR)

# 显示结果图像
cv2.imshow('result', result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果 

3.HSI

HSI模型将亮度分量改为了强度(Intensity),并将饱和度分量改为了饱和度(Saturation)和色调(Intensity),这样可以更好地描述颜色的强度和鲜艳程度。

代码

import numpy as np
import cv2

def rgb2hsi(img):
    # 将RGB图像转换为HSI图像
    img = img.astype(np.float32) / 255.0
    b, g, r = cv2.split(img)
    hsi = np.zeros_like(img)
    eps = 1e-6
    for i, color in enumerate([b, g, r]):
        numerator = 0.5 * ((r - g) + (r - b))
        denominator = np.sqrt((r - g) ** 2 + (r - b) * (g - b))
        theta = np.arccos(numerator / (denominator + eps))
        h = np.zeros_like(theta)
        h[color <= b] = theta[color <= b]
        h[color > b] = 2 * np.pi - theta[color > b]
        hsi[..., i] = h / (2 * np.pi)
    hsi[..., 1] = 1 - 3 * np.min(hsi[..., :3], axis=-1)
    hsi[..., 2] = np.sum(img, axis=-1) / 3.0
    return hsi

def hsi2rgb(img):
    # 将HSI图像转换为RGB图像
    img = img.copy()
    h, s, i = cv2.split(img)
    h = h * 2 * np.pi
    bgr = np.zeros_like(img)
    for i, color in enumerate([bgr[..., 0], bgr[..., 1], bgr[..., 2]]):
        if i == 0:  # Blue
            idx = np.logical_and(h >= 0, h < 2 * np.pi / 3)
            color[idx] = i + (1 - s[idx])
            idx = np.logical_and(h >= 2 * np.pi / 3, h < 4 * np.pi / 3)
            color[idx] = i + (1 - s[idx]) * (h[idx] - 2 * np.pi / 3) / (2 * np.pi / 3)
            idx = np.logical_and(h >= 4 * np.pi / 3, h < 2 * np.pi)
            color[idx] = i + s[idx]
        elif i == 1:  # Green
            idx = np.logical_and(h >= 0, h < 2 * np.pi / 3)
            color[idx] = i + s[idx] * (h[idx]) / (2 * np.pi / 3)
            idx = np.logical_and(h >= 2 * np.pi / 3, h < 4 * np.pi / 3)
            color[idx] = i + (1 - s[idx])
            idx = np.logical_and(h >= 4 * np.pi / 3, h < 2 * np.pi)
            color[idx] = i + s[idx] * (2 * np.pi - h[idx]) / (2 * np.pi / 3)
        else:  # Red
            idx = np.logical_and(h >= 0, h < 2 * np.pi / 3)
            color[idx] = i + s[idx]
            idx = np.logical_and(h >= 2 * np.pi / 3, h < 4 * np.pi / 3)
            color[idx] = i + s[idx] * (4 * np.pi / 3 - h[idx]) / (2 * np.pi / 3)
            idx = np.logical_and(h >= 4 * np.pi / 3, h < 2 * np.pi)
            color[idx] = i + (1 - s[idx])
    bgr[..., 0] = bgr[..., 0] * 255.0
    bgr[..., 1] = bgr[..., 1] * 255.0
    bgr[..., 2] = bgr[..., 2] * 255.0
    return bgr.astype(np.uint8)

# 示例代码
img = cv2.imread('example.jpg')
hsi_img = rgb2hsi(img)
rgb_img = hsi2rgb(hsi_img)
cv2.imshow('Original Image', img)
cv2.imshow('HSI Image', hsi_img)
cv2.imshow('RGB Image', rgb_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 结果

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

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

相关文章

YOLOv8 YoLov8l 模型输出及水果识别

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] &#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/m…

认识线程和创建线程

目录 1.认识多线程 1.1线程的概念 1.2进程和线程 1.2.1进程和线程用图描述关系 1.2.2进程和线程的区别 1.3Java 的线程和操作系统线程的关系 2.创建线程 2.1继承 Thread 类 2.2实现 Runnable 接口 2.3匿名内部类创建 Thread 子类对象 2.4匿名内部类创建 Runnable 子类对…

LLM之Agent(五)| AgentTuning:清华大学与智谱AI提出AgentTuning提高大语言模型Agent能力

​论文地址&#xff1a;https://arxiv.org/pdf/2310.12823.pdf Github地址&#xff1a;https://github.com/THUDM/AgentTuning 在ChatGPT带来了大模型的蓬勃发展&#xff0c;开源LLM层出不穷&#xff0c;虽然这些开源的LLM在各自任务中表现出色&#xff0c;但是在真实环境下作…

1.cloud-微服务架构编码构建

1.微服务cloud整体聚合父工程 1.1 New Project 1.2 Maven选版本 1.3 字符编码 1.4 注解生效激活 主要为lombok中的Data 1.5 java编译版本选8 1.6 File Type过滤 *.hprof;*.idea;*.iml;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;vssver.scc;v…

嵌入式C语言代码的基本编写规范要求

编码规范&#xff0c;没有最好&#xff0c;只有最合适&#xff0c;有但不执行不如没有。1 编码原则 1.1 可读性原则 &#xff08;1&#xff09;清晰第一 清晰性是易于维护程序必须具备的特征。维护期变更代码的成本远远大于开发期&#xff0c;编写程序应该以人为本&#xff0c…

vue3中子组件调用父组件的方法

<script lang"ts" setup>前提 父组件&#xff1a; 子组件&#xff1a; const emit defineEmits([closeson]) 在子组件的方法中使用&#xff1a; emit(closeson)

Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用)

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第五章、JSP模板集成 5.1 引入JSP依赖 <!--引入jsp解析依赖--> <!--C标签库--> <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version&…

ES6之Symbol

ES6中为我们新增了一个原始数据类型Symbol&#xff0c;让我为大家介绍一下吧&#xff01; Symbol它表示是独一无二的值 Symbol要如何创建 第一种创建方式&#xff1a; let sy Symbol()第二种创建方式&#xff1a; let sy Symbol.for()具体独一无二在哪呢&#xff1f;它们的地…

【MyBatis系列】MyBatis字符串问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java中的IO流①——IO流的体系、字节流、try...catch异常处理

概述 IO流的分类 IO流的体系 这四个类都是抽象类&#xff0c;所以需要实现类对象才能使用---> 字节流 FileInputStream--> 书写细节 代码示范 此时文件a.txt内容为abcde 使用char强转和read方法调用五次read方法--> public static void main(String[] args) throws IO…

JavaScript-节点操作

节点操作 DOM节点 DOM节点&#xff1a;DOM树里每一个内容都称之为节点 节点类型&#xff1a; 元素节点 所有的标签 比如body、divhtml时跟节点 属性节点 所有的属性&#xff0c;比如href 文本节点 所有的文本 其他 查找节点 节点的关系&#xff1a;针对的找亲戚返回的都是…

redis中缓存雪崩,缓存穿透,缓存击穿等

缓存雪崩 由于原有缓存失效&#xff08;或者数据未加载到缓存中&#xff09;&#xff0c;新缓存未到期间&#xff08;缓存正常从Redis中获取&#xff0c;如下图&#xff09;所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库CPU和内存造成巨大压力&#xff0c…

H264视频编码原理

说到视频&#xff0c;我们首先想到的可能就是占内存。我们知道一个视频是由一连串图像序列组成的&#xff0c;视频中图像一般是 YUV 格式。假设有一个电影视频&#xff0c;分辨率是 1080P&#xff0c;帧率是 25fps&#xff0c;并且时长是 2 小时&#xff0c;如果不做视频压缩的…

每日一练【三数之和】

一、题目描述 15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可…

【Java】构建哈夫曼树和输出哈夫曼编码

问题背景 一个单位有12个部门&#xff0c;每个部门都有一部电话&#xff0c;但是整个单位只有一根外线&#xff0c;当有电话打过来的时候&#xff0c;由转接员转到内线电话&#xff0c;已知各部门使用外线电话的频率为&#xff08;次/天&#xff09;&#xff1a;5 20 10 12 8 …

算法Day23 简单吃饭(0-1背包)

简单吃饭&#xff08;0-1背包&#xff09; Description Input Output Sample 代码 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int total scanner.nextInt(…

Java一对一聊天程序

我们首先要完成服务端&#xff0c;不然出错&#xff0c;运行也要先运行服务端&#xff0c;如果不先连接服务端&#xff0c;就不监听&#xff0c;那客户端不知道连接谁 服务端 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.Actio…

Qt之QSlider和QProgressBar

Qt之QSlider和QProgressBar 实验结果 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);connect(ui->dial,&QDial::valueChanged,this,&Widget::do_val…

Redis rdb源码解析

前置学习&#xff1a;Redis server启动源码-CSDN博客 1、触发时机 1、执行save命令--->rdbSave函数 2、执行bgsave命令--->rdbSaveBackground函数或者&#xff08;serverCron->prepareForShutdown&#xff09; 3&#xff0c;主从复制-->startBgsaveForReplication…

序列的Z变换(信号的频域分析)

1. 关于Z变换 2. 等比级数求和 3. 特殊序列的Z变换 4. 因果序列/系统收敛域的特点 5. 例题