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.pswp.cn/news/902021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902021.shtml
英文地址,請注明出處:http://en.pswp.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,粒…