RGB图像转化为HSI图像

来源:互联网 发布:淘宝店铺类目怎么修改 编辑:程序博客网 时间:2024/05/20 20:58

最近用到RGB图像需要往HSI上转化,就参照公式和奈奈酱前辈的写了点代码,

#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/highgui/highgui.hpp"
#include<math.h>
using namespace std;
using namespace cv;
int main ()
{
Mat BGRImage,BImage,GImage,RImage,HImage,SImage,IImage,dstImage;   
BGRImage=imread("1.jpg");
imshow("原图",BGRImage);
Mat HSIImage = Mat(Size(BGRImage.cols, BGRImage.rows), CV_8UC3);
// 分离R G B 分量
    vector<Mat>channels;
split(BGRImage,channels);
BImage = channels.at(0);
GImage = channels.at(1);
RImage = channels.at(2);
vector<Mat>channel;
split(HSIImage,channel);
HImage=channel.at(0);
SImage=channel.at(1);
IImage=channel.at(2);
// HImage = Mat(BImage.size(),BImage.type());
// SImage = Mat(BImage.size(),BImage.type());
// IImage = Mat(BImage.size(),BImage.type());


// 建立同样大小的矩阵存放HSI的值
//  dstImage = Mat::zeros(srcImage.size(),srcImage.type());
//  HImage = Mat::zeros(BImage.size(),BImage.type());



int row = BGRImage.rows;
int col = HSIImage.cols;
for(int i=0;i<row;++i)
{
uchar* B = BImage.ptr<uchar>(i);
uchar* G = GImage.ptr<uchar>(i);
uchar* R = RImage.ptr<uchar>(i);
uchar* H = HImage.ptr<uchar>(i);
uchar* S = SImage.ptr<uchar>(i);
uchar* I = IImage.ptr<uchar>(i);

for(int j=0;j<col;++j)
{

//计算H值

double L =(2*R[j]-B[j]-G[j]);
double K = R[j]*R[j]+B[j]*B[j]+G[j]*G[j]-R[j]*G[j]-B[j]*R[j]-B[j]*G[j];
if (K==0)
H[j]=0 ;
else
{
double M = sqrt(K);
double T ;
T=acos(L/(2*M))*180/3.14;
if (G[j]>=B[j])
H[j]=int(T*255/360);
else
H[j]=int((360-T)*255/360);
}
// 计算 S 值
double P,Q;
if((R[j]<=G[j])&&(R[j]<=B[j]))
P=R[j];
if((G[j]<=R[j])&&(G[j]<=B[j]))
P=G[j];
   if((B[j]<=R[j])&&(B[j]<=G[j]))
P=B[j];
Q = R[j]+B[j]+G[j];
if (Q==0)
S[j]=0;
else
{


S[j]=int((1-3*P/Q)*255);
}
// 计算 I 值
I[j]=(R[j]+B[j]+G[j])/3.0;

}
B=NULL;
G=NULL;
R=NULL;
H=NULL;
S=NULL;
I=NULL;
}
// channel.at(0) = HImage;
// channel.at(1) = SImage;
// channel.at(2) = IImage;
merge(channel,HSIImage);
imshow("HSI图像",HSIImage);
waitKey(0);
return 0;  
}

0 0
原创粉丝点击