C++/Python实现RGB和HSI相互转换

1--C++版本

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>// RGB to HSI
cv::Vec3f RGBtoHSI(cv::Vec3b rgb) {float B = rgb[0] / 255.0f;float G = rgb[1] / 255.0f;float R = rgb[2] / 255.0f;float num = 0.5f * ((R - G) + (R - B));float den = sqrt((R - G)*(R - G) + (R - B)*(G - B));float H = acos(num / (den + 1e-6f)); // 防止除0if (B > G)H = 2 * CV_PI - H;H = H * 180 / CV_PI; // 转为角度float minRGB = std::min({ R, G, B });float sumRGB = R + G + B;float S = 1 - 3 * minRGB / (sumRGB + 1e-6f);float I = sumRGB / 3;return cv::Vec3f(H, S, I);
}// HSI to RGB
cv::Vec3b HSItoRGB(cv::Vec3f hsi) {float H = hsi[0], S = hsi[1], I = hsi[2];float R, G, B;H = H * CV_PI / 180; // 度转弧度if (H < 2 * CV_PI / 3) {B = I * (1 - S);R = I * (1 + (S * cos(H)) / (cos(CV_PI / 3 - H) + 1e-6f));G = 3 * I - (R + B);}else if (H < 4 * CV_PI / 3) {H = H - 2 * CV_PI / 3;R = I * (1 - S);G = I * (1 + (S * cos(H)) / (cos(CV_PI / 3 - H) + 1e-6f));B = 3 * I - (R + G);}else {H = H - 4 * CV_PI / 3;G = I * (1 - S);B = I * (1 + (S * cos(H)) / (cos(CV_PI / 3 - H) + 1e-6f));R = 3 * I - (G + B);}return cv::Vec3b(cv::saturate_cast<uchar>(B * 255),cv::saturate_cast<uchar>(G * 255),cv::saturate_cast<uchar>(R * 255));
}int main() {cv::Mat img = cv::imread("./images_code/Fig0630(01)(strawberries_fullcolor).tif");cv::Mat hsi(img.rows, img.cols, CV_32FC3);// RGB to HSIfor (int i = 0; i < img.rows; i++) {for (int j = 0; j < img.cols; j++) {hsi.at<cv::Vec3f>(i, j) = RGBtoHSI(img.at<cv::Vec3b>(i, j));}}// 修改 HSI 分量for (int i = 0; i < hsi.rows; i++) {for (int j = 0; j < hsi.cols; j++) {cv::Vec3f& pixel = hsi.at<cv::Vec3f>(i, j);// 调整HSI参数:pixel[0] = fmod(pixel[0] + 30, 360);      // 色调加30度pixel[1] = std::min(1.0f, pixel[1] * 1.2f);     // 饱和度增强20%pixel[2] = std::min(1.0f, pixel[2] * 1.1f);     // 亮度增强10%}}// HSI to RGBcv::Mat result(img.rows, img.cols, CV_8UC3);for (int i = 0; i < hsi.rows; i++) {for (int j = 0; j < hsi.cols; j++) {result.at<cv::Vec3b>(i, j) = HSItoRGB(hsi.at<cv::Vec3f>(i, j));}}imwrite("./test.jpg", result);std::cout << "save image to test.jpg" << std::endl;return 0;
}

2--Python版本

import cv2
import numpy as np
import mathdef rgb_to_hsi(pixel):B, G, R = pixel / 255.0num = 0.5 * ((R - G) + (R - B))den = math.sqrt((R - G)**2 + (R - B) * (G - B)) + 1e-6  # 防止除0theta = math.acos(num / den)if B > G:H = 2 * math.pi - thetaelse:H = thetaH = H * 180 / math.pi  # 弧度转角度min_val = min(R, G, B)sum_rgb = R + G + BS = 1 - 3 * min_val / (sum_rgb + 1e-6)I = sum_rgb / 3.0return np.array([H, S, I], dtype=np.float32)def hsi_to_rgb(hsi):H, S, I = hsiH_rad = H * math.pi / 180  # 度转弧度if H_rad < 2 * math.pi / 3:B = I * (1 - S)R = I * (1 + S * math.cos(H_rad) / (math.cos(math.pi / 3 - H_rad) + 1e-6))G = 3 * I - (R + B)elif H_rad < 4 * math.pi / 3:H_rad -= 2 * math.pi / 3R = I * (1 - S)G = I * (1 + S * math.cos(H_rad) / (math.cos(math.pi / 3 - H_rad) + 1e-6))B = 3 * I - (R + G)else:H_rad -= 4 * math.pi / 3G = I * (1 - S)B = I * (1 + S * math.cos(H_rad) / (math.cos(math.pi / 3 - H_rad) + 1e-6))R = 3 * I - (G + B)return np.clip([B, G, R], 0, 1) * 255if __name__ == "__main__":# read imageimg = cv2.imread('./images_code/Fig0630(01)(strawberries_fullcolor).tif')rows, cols = img.shape[:2]hsi_img = np.zeros((rows, cols, 3), dtype=np.float32)# RGB → HSIfor i in range(rows):for j in range(cols):hsi_img[i, j] = rgb_to_hsi(img[i, j])# adadjust HSI for i in range(rows):for j in range(cols):H, S, I = hsi_img[i, j]H = (H + 30) % 360S = min(1.0, S * 1.2) # 色调加30度I = min(1.0, I * 1.1) # 饱和度增强20%hsi_img[i, j] = [H, S, I] # 亮度增强10%# HSI → RGBresult = np.zeros_like(img)for i in range(rows):for j in range(cols):rgb = hsi_to_rgb(hsi_img[i, j])result[i, j] = np.uint8(rgb)# save imagecv2.imwrite('./test.jpg', result)print("save image to test.jpg")

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

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

相关文章

【Linux我做主】make和makefile自动化构建

make和makefile自动化构建 make和makefile自动化构建github地址前言背景介绍为什么需要make和makefile&#xff1f; make和makefile解析什么是make和makefile依赖关系和依赖方法核心语法结构简单演示编译清理 多阶段编译示例 make时执行的顺序场景1&#xff1a;clean目标在前(特…

Qt 入门 5 之其他窗口部件

Qt 入门 5 之其他窗口部件 本文介绍的窗口部件直接或间接继承自 QWidget 类详细介绍其他部件的功能与使用方法 1. QFrame 类 QFrame类是带有边框的部件的基类。它的子类包括最常用的标签部件QLabel另外还有 QLCDNumber、QSplitter,QStackedWidget,QToolBox 和 QAbstractScrol…

JAVA学习-多线程

线程 线程(Thread)是一个程序内部的一条执行流程。 程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 线程的常用方法及构造器&#xff1a; Thread提供的常用方法public void run() 线程的任务方法public void start() 启动线程public String getName() …

Github 2025-04-19Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-04-19统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目1Rust: 构建可靠高效软件的开源项目 创建周期:5064 天开发语言:Rust协议类型:OtherStar数量:92978 个Fork数量:12000…

OpenLayers:视图变换的方法

一、什么是视图变换&#xff1f; 视图变换就是指视图的 extent&#xff08;范围&#xff09;、center&#xff08;中心点&#xff09;、zoom&#xff08;缩放级别&#xff09;、 resolution&#xff08;分辨率&#xff09;、rotation&#xff08;旋转角&#xff09;等参数发生…

数字孪生火星探测车,星际探索可视化

运用图扑构建数字孪生火星探测车&#xff0c;高精度还原外观与内部构造。实时映射探测车在火星表面的移动、探测作业及设备状态&#xff0c;助力科研人员远程监测、分析数据&#xff0c;为火星探索任务提供可视化决策支持。

【NLP 66、实践 ⑰ 基于Agent + Prompt Engineering文章阅读】

你用什么擦干我的眼泪 莎士比亚全集 工业纸巾 还是你同样泛红的眼睛 —— 4.19 一、⭐【核心函数】定义大模型调用函数 call_large_model prompt&#xff1a;用户传入的提示词&#xff08;如 “请分析这篇作文的主题”&#xff09;&#xff0c;指导模型执行任务 client&…

黑马Java基础笔记-1

JVM&#xff0c;JDK和JRE JDK是java的开发环境 JVM虚拟机&#xff1a;Java程序运行的地方 核心类库&#xff1a;Java已经写好的东西&#xff0c;我们可以直接用。 System.out.print中的这些方法就是核心库中的所包含的 开发工具: javac&#xff08;编译工具&#xff09;、java&…

PR第一课

目录 1.新建 2.PR内部设置 3.导入素材 4.关于素材窗口 5.关于编辑窗口 6.序列的创建 7.视频、图片、音乐 7.1 带有透明通道的素材 8.导出作品 8.1 打开方法 8.2 导出时&#xff0c;需要修改的参数 1.新建 2.PR内部设置 随意点开 编辑->首选项 中的任意内容&a…

Xcode16 调整 Provisioning Profiles 目录导致证书查不到

cronet demo 使用的 ninja 打包&#xff0c;查找 Provisioning Profiles 路径是 ~/Library/MobileDevice/Provisioning Profiles&#xff0c;但 Xcode16 把该路径改为了 ~/Library/Developer/Xcode/UserData/Provisioning Profiles&#xff0c;导致在编译 cronet 的demo 时找不…

【更新完毕】2025华中杯C题数学建模网络挑战赛思路代码文章教学数学建模思路:就业状态分析与预测

完整内容请看文末最后的推广群 先展示文章和代码、再给出四个问题详细的模型 基于多模型下的就业状态研究 摘要 随着全球经济一体化和信息技术的迅猛发展&#xff0c;失业问题和就业市场的匹配性问题愈加突出。为了解决这一问题&#xff0c;本文提出了一种基于统计学习和机器学…

[HOT 100] 1964. 找出到每个位置为止最长的有效障碍赛跑路线

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 1964. 找出到每个位置为止最长的有效障碍赛跑路线 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 你打算构建一些障碍赛跑路线。给你一个 下标从 0 开始 的整数数组 obst…

2025年KBS SCI1区TOP:增强天鹰算法EBAO,深度解析+性能实测

目录 1.摘要2.天鹰算法AO原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了增强二进制天鹰算法&#xff08;EBAO&#xff09;&#xff0c;针对无线传感器网络&#xff08;WSNs&#xff09;中的入侵检测系统&#xff08;IDSs&#xff09;。由于WSNs的特点是规模…

JavaScript数据类型简介

在JavaScript中&#xff0c;理解不同的数据类型是掌握这门语言的基础。数据类型决定了变量可以存储什么样的值以及这些值能够执行的操作。JavaScript支持多种数据类型&#xff0c;每种都有其特定的用途和特点。本文将详细介绍JavaScript中的主要数据类型&#xff0c;并提供一些…

性能比拼: Elixir vs Go(第二轮)

本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance Benchmark (Round 2) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 这是第二轮关于 Elixir 和 Go 的对比测试。我收到了一份来自 Elixir 创作者的 Pull Request &#xff0c;并且我认为…

接口自动化 ——fixture allure

一.参数化实现数据驱动 上一篇介绍了参数化&#xff0c;这篇 说说用参数化实现数据驱动。在有很多测试用例的时候&#xff0c;可以将测试用例都存储在文件里&#xff0c;进行读写调用。本篇主要介绍 csv 文件和 json 文件。 1.读取 csv 文件数据 首先创建 csv 文件&#xff…

`peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么

peft(Parameter-Efficient Fine-Tuning:高效微调)是什么 peft库是Hugging Face推出的用于高效参数微调的库,它能在不调整模型全部参数的情况下,以较少的可训练参数对预训练模型进行微调,从而显著降低计算资源需求和微调成本。以下从核心功能、优势、常见微调方法、使用场…

编程常见错误归类

上一篇讲了调试&#xff0c;今天通过一个举例回忆一下上一篇内容吧&#xff01; 1. 回顾&#xff1a;调试举例 在VS2022、X86、Debug的环境下&#xff0c;编译器不做任何优化的话&#xff0c;下⾯代码执⾏的结果是啥&#xff1f; #include <stdio.h> int main() {int …

在windows上交叉编译opencv供RK3588使用

环境 NDK r27、RK3588 安卓板子、Android 12 步骤操作要点1. NDK 下载选择 r27 版本&#xff0c;解压到无空格路径&#xff08;如 C:/ndk&#xff09;2. 环境变量配置添加 ANDROID_NDK_ROOT 和工具链路径到系统 PATH3. CMake 参数调整指定 ANDROID_NATIVE_API_LEVEL31、ANDRO…

浅析MySQL事务锁

在 MySQL 中,事务锁是用于确保数据一致性和并发控制的重要机制。事务锁可以帮助防止多个事务同时修改同一数据,从而避免数据不一致和脏读、不可重复读、幻读等问题。 以下是 MySQL 事务锁的关键点总结: 事务锁:用于确保数据一致性和并发控制。锁的类型: 行级锁:InnoDB,粒…