#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("123.jpg", 1);
if(src.empty())
cerr << "Error: Loading image" << endl;
Mat hsi(src.rows, src.cols, src.type());
float r, g, b, H, S, I, num, den, theta, sum, min_RGB;
for(int i=0; i<src.rows; i++)
{
for(int j=0; j<src.cols; j++)
{
b = src.at<Vec3b>(i, j)[0];
g = src.at<Vec3b>(i, j)[1];
r = src.at<Vec3b>(i, j)[2];
// 归一化
b = b/255.0;
g = g/255.0;
r = r/255.0;
num = 0.5 * ((r-g)+(r-b));
den = sqrt((r-g)*(r-g)+(r-b)*(g-b));
theta = acos(num/den);
if(den == 0){
H = 0; // 分母不能为0
}
else{
if(b <= g){
H = theta;
}
else{
H = (2*3.14169265 - theta);
}
}
min_RGB = min(min(b,g),r); // min(R,G,B)
sum = b+g+r;
if(sum == 0)
{
S = 0;
}else{
S = 1 - 3*min_RGB/sum;
}
I = sum/3.0;
H = H/(2*3.14159265);
// 将S分量和H分量都扩充到[0,255]区间以便于显示;一般H分量在[0,2pi]之间,S在[0,1]之间
hsi.at<Vec3b>(i, j)[0] = H*255;
hsi.at<Vec3b>(i, j)[1] = S*255;
hsi.at<Vec3b>(i, j)[2] = I*255;
}
}
namedWindow("rgb_lwpImg", CV_WINDOW_AUTOSIZE);
namedWindow("hsi_lwpImg", CV_WINDOW_AUTOSIZE);
imshow("rgb_lwpImg", src);
imshow("hsi_lwpImg", hsi);
waitKey(0);
return 0;
}
(OpenCV+C++)--RGB转HSI
最新推荐文章于 2024-07-18 09:29:14 发布