[c++]opencv实现RGB和HSI的相互转换

news/2025/1/18 12:59:22/

文章目录

  • 公式
    • RGB转HSI
    • HSI转RGB
  • RGB转HSI代码
  • HSI转RGB代码
  • 示例

公式

HSI彩色模型就是色调(hub)、饱和度(saturation)、亮度(intensity)

  • 色调:描述纯色(纯黄色、纯蓝色之类)的颜色属性
  • 饱和度:描述一种纯色被白光稀释的程度
  • 亮度:即强度(类似灰度级的感觉)

以下公式来源论文《Color image enhancement with exact HSI color model》

RGB转HSI

I = R + G + B 3 I=\frac{R+G+B}{3} I=3R+G+B
H = { θ , if  B ≤ G 36 0 ∘ − θ , if  B > G 其 中 θ = cos ⁡ − 1 { 1 2 [ ( R − G ) + ( R − B ) ] [ ( R − G ) 2 + ( R − B ) ( G − B ) ] 1 / 2 } H=\left\{\begin{array}{ll} \theta, & \text { if } B \leq G \\ 360^{\circ}-\theta, & \text { if } B>G \end{array}\right. \\其中 \theta=\cos ^{-1}\left\{\frac{\frac{1}{2}[(R-G)+(R-B)]}{\left[(R-G)^{2}+(R-B)(G-B)\right]^{1 / 2}}\right\} H={θ,360θ, if BG if B>Gθ=cos1{[(RG)2+(RB)(GB)]1/221[(RG)+(RB)]}
S = 1 − 3 min ⁡ ( R , G , B ) R + G + B S=1-\frac{3\min (R, G, B)}{R+G+B} S=1R+G+B3min(R,G,B)

HSI转RGB

  • 0 ∘ ≤ H < 12 0 ∘ 0^{\circ} \leq H<120^{\circ} 0H<120
    B = I ( 1 − S ) R = I [ 1 + S cos ⁡ H cos ⁡ ( 6 0 ∘ − H ) ] G = 3 I − ( R + B ) \begin{aligned} B &=I(1-S) \\ R &=I\left[1+\frac{S \cos H}{\cos \left(60^{\circ}-H\right)}\right] \\ G &=3 I-(R+B) \end{aligned} BRG=I(1S)=I[1+cos(60H)ScosH]=3I(R+B)
  • 12 0 ∘ ≤ H < 24 0 ∘ 120^{\circ} \leq H<240^{\circ} 120H<240
    H = H − 24 0 ∘ R = I ( 1 − S ) G = I [ 1 + S cos ⁡ H cos ⁡ ( 6 0 ∘ − H ) ] B = 3 I − ( R + G ) \begin{aligned} H&=H-240^{\circ}\\ R &=I(1-S) \\ G &=I\left[1+\frac{S \cos H}{\cos \left(60^{\circ}-H\right)}\right] \\ B &=3 I-(R+G) \end{aligned} HRGB=H240=I(1S)=I[1+cos(60H)ScosH]=3I(R+G)
  • 24 0 ∘ ≤ H < 36 0 ∘ 240^{\circ} \leq H<360^{\circ} 240H<360
    H = H − 24 0 ∘ G = I ( 1 − S ) B = I [ 1 + S cos ⁡ H cos ⁡ ( 6 0 ∘ − H ) ] R = 3 I − ( G + B ) \begin{aligned} H &=H-240^{\circ}\\ G & =I(1-S) \\ B &=I\left[1+\frac{S \cos H}{\cos \left(60^{\circ}-H\right)}\right] \\ R &=3 I-(G+B) \end{aligned} HGBR=H240=I(1S)=I[1+cos(60H)ScosH]=3I(G+B)

RGB转HSI代码

Mat RGB2HSI(const Mat & rgb){Mat hsi(rgb.rows, rgb.cols, rgb.type());float  H=0, S=0, I=0;for(int i=0; i < rgb.rows; i++)for(int j=0; j < rgb.cols; j++){float B = rgb.at<Vec3b>(i, j)[0] / 255.f,G = rgb.at<Vec3b>(i, j)[1] / 255.f,R = rgb.at<Vec3b>(i, j)[2] / 255.f;float num = (R - G + R - B) / 2,den = sqrt((R - G) * (R - G) + (R - B) * (G - B)),theta = acos(num/den);if(den == 0) H = 0; // 分母不能为0else H = B <= G ? theta / (2 * MY_PI) : 1 - theta / (2 * MY_PI);float sum = B + G + R;if(sum == 0) S = 0;else S = 1 - 3 * min(min(B, G), R) / sum;I = sum/3.0;hsi.at<Vec3b>(i, j)[0] = H*255;hsi.at<Vec3b>(i, j)[1] = S*255;hsi.at<Vec3b>(i, j)[2] = I*255;}return hsi;
}

HSI转RGB代码

Mat HSI2RGB(const Mat & hsi){Mat rgb(hsi.rows, hsi.cols, hsi.type());float  R=0,G=0,B=0;for(int i=0; i < hsi.rows; i++)for(int j=0; j < hsi.cols; j++){float H = hsi.at<Vec3b>(i, j)[0] / 255.f * 2 * MY_PI,S = hsi.at<Vec3b>(i, j)[1] / 255.f,I = hsi.at<Vec3b>(i, j)[2] / 255.f;if(H < 120.f * MY_PI / 180.f){B=I*(1-S);R=I*(1+ S*cos(H)/cos(60.f* MY_PI / 180.f-H));G=3*I-R-B;}else if(H >= 120.f * MY_PI / 180.f && H < 240 * MY_PI / 180.f){H-=(120.f * MY_PI / 180.f);R=I*(1-S);G=I*(1+ S*cos(H)/cos(60.f* MY_PI / 180.f-H));B=3*I-R-G;}else if(H >= 240.f * MY_PI / 180.f){H-=(240.f * MY_PI / 180.f);G=I*(1-S);B=I*(1+ S*cos(H)/cos(60.f* MY_PI / 180.f-H));R=3*I-B-G;}rgb.at<Vec3b>(i, j)[0] = B*255;rgb.at<Vec3b>(i, j)[1] = G*255;rgb.at<Vec3b>(i, j)[2] = R*255;}return rgb;
}

示例

#include<iostream>
#include <opencv2/opencv.hpp>
#define MY_PI 3.1415
using namespace std;
using namespace cv;
Mat RGB2HSI(const Mat & rgb);
Mat HSI2RGB(const Mat & hsi);
int main(int argc, char * argv[]){Mat img = imread("../image/RGB.jpg");imshow("origin", img);waitKey();Mat hsi = RGB2HSI(img);imshow("hsi", hsi);waitKey();Mat rgb=HSI2RGB(hsi);imshow("rgb", rgb);waitKey();return 0;
}

在这里插入图片描述


http://www.ppmy.cn/news/558093.html

相关文章

suse nginx 安装mysql_nginx+php+mysql+erlang+mongo环境安装

---------------- 把源码包放在/usr/local/tar/目录下--------------------------------------------------------------------------- ---------centos 是用yum安装 &#xff0c;suse 是用yast --install 安装 yum -y install gcc yum -y install gcc-c yum -y install ncurse…

Matlab数字图像处理学习记录【5】——彩色图像处理

彩色图像处理 一.Matlab中彩色图像的表示方法1.1RGB图像1.2索引图像1.3用来处理RGB图像或索引图像的IPT函数 二.转换值其他彩色空间2.1NTSC彩色空间2.2YCbCr彩色空间2.3HSV色彩空间2.4CMY和CMYK彩色空间2.5 HSI彩色空间 三.彩色图像处理基础四.彩色变换五.彩色图像的空间滤波5.…

数据仓库4.0

仅用于自己学习 数据流程设计 搭建 版本选择 Apache :运维麻烦&#xff0c;组件间兼容性需要自己调研 CDH&#xff1a; 国内使用最多的版本&#xff0c;6.32之前免费&#xff0c;从2021年开始收费。 1个节点1万美元 云服务选择 阿里云的EMR(不用搭建平台和考虑兼容性问题…

Spring Web工程web.xml零配置即使用Java Config + Annotation

摘要: 在Spring 3.0之前&#xff0c;我们工程中常用Bean都是通过XML形式的文件注解的&#xff0c;少了还可以&#xff0c;但是数量多&#xff0c;关系复杂到后期就很难维护了&#xff0c;所以在3.x之后Spring官方推荐使用Java Config方式去替换以前冗余的XML格式文件的配置方式…

开源地址

开源中国&#xff1a;http://www.oschina.net/project/zh csdn专访&#xff1a;http://blog.csdn.net/blogdevteam/article/list/2 iteye&#xff1a;http://www.iteye.com/magazines/ java快速开发平台&#xff0c;java二次开发平台 G4Studio fastunit java-hi beetl o…

腾讯云检测到你的服务器对其他服务器的攻击行为

某天突然收到腾讯云的邮件说我是在攻击别人 第一时间反应是我的服务器被入侵当作肉鸡了&#xff0c;然后排查ssh有没有被破解&#xff0c;全盘扫描病毒&#xff0c;检测任务计划&#xff0c;进程等&#xff0c;结果没有什么异常。 第二天打开自己家的路由器发现内网穿透客户端…

宇视警戒球智能跟踪功能配置方法

警戒球智能跟踪功能 名词解释: 智能跟踪&#xff1a;当有人进入监控区域时&#xff0c;警戒球会锁定目标&#xff0c;持续跟踪。常用于少有人出现的场所&#xff0c;可以大大解决巡视难的问题。#本功能可单机使用# 支持的型号&#xff1a;宇视警戒球全系列产品 智能跟踪功能…

服务器被检测出挖矿

有位朋友说&#xff0c;他服务器使用的好好的&#xff0c;服务商突然封了他服务器&#xff0c;说是被检测出挖矿&#xff0c;这位朋友一脸懵“我开游戏的&#xff0c;挖什么矿”。突然地关停服务器导致这位朋友损失惨重&#xff0c;那么为什么会被检测出挖矿&#xff0c;以及怎…