【C++版本】OpenCV实现RGB转HSI

来源:互联网 发布:java md5解密密码 编辑:程序博客网 时间:2024/05/29 07:38
#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;}

这里写图片描述

原创粉丝点击