• OpenCV中RGB和HSV转换的问题


    1、一般情况下HSV模型各分量的取值范围为:H为0到360°,S为0到100%,V为0到255。但是在OpenCV中在由RGB转换到HSV的过程中,发现HSV中H为0到180°,S为0到255,V为0到255。代码如下:

    IplImage* src = cvLoadImage("1.jpg",1);   

    IplImage* imghsv = cvCreateImage(cvGetSize(src),8,3);

    cvCvtColor(src ,imghsv,CV_BGR2HSV);//BGR转换成HSV模型

    2、上述图片保存的过程中,图像以8位3通道的形式保存,每个颜色分量占用8位,值的范围为0到255,所以OpenCV将H值的范围缩小了一半,变为0到180°。可以调用cvConverScale将图像从8位转换为32位float型。这样HSV的范围就是:H为0到360°,S为0到100%,V为0到255。测试代码如下:

    Mat mat1 = cv::imread("1.png");
    CvScalar s1;
    CvScalar s2;
    CvScalar s3;
    IplImage image1 = mat1;
    int width = mat1.rows;
    int height = mat1.cols;
    
    Mat mat2 = mat1.clone();
    IplImage image2 = mat2;
    
    cvCvtColor(&image1,&image2,CV_BGR2HSV); 
    
    IplImage* image3 = cvCreateImage(cvGetSize(&image1),IPL_DEPTH_32F,3);
    cvConvertScale(&image1,image3,1.0,0);	//将src图像从8位转换成32位float型变量
    
    IplImage* imghsv = cvCreateImage(mat1.size(),IPL_DEPTH_32F,3);
    cvCvtColor(image3,imghsv,CV_BGR2HSV);//BGR转换成HSV模型
    
    for(int i=0; i<width; i++)
    {
    	for(int j=0; j<height; j++)
    	{
    		s1 = cvGet2D(&image1, i, j);
    		s2 = cvGet2D(&image2, i, j);
    	        s3 = cvGet2D(imghsv, i, j);
    	}
    }
    

    3、当进行HSV各分量显示的时候,可以通过cvSplit函数将各通道分离,然后通过cvConvertScale函数将各分量的范围都转化成0到255,在通过8位无符号型图像显示即可。因为cvShowImage函数只能显示8位无符号型图像,不能显示32位Float型图像。

    4、当进行HSV模型还原到RGB模型时,这里使用cvCvtColor函数就要注意,输入的HSV模型的图像必须将HSV各分量还原到默认的范围。这样cvCvtColor转换后的RGB图像才是正确的。

    参考:

    http://blog.csdn.net/harryching/article/details/20486003

  • 相关阅读:
    关于生产库的表空间是否自己主动扩展的看法?
    Hive创建外部表以及分区
    oninput,onpropertychange,onchange的使用方法和差别
    cacti
    java实现第五届蓝桥杯殖民地
    java实现第五届蓝桥杯殖民地
    java实现第五届蓝桥杯殖民地
    java实现第五届蓝桥杯殖民地
    java实现第五届蓝桥杯殖民地
    java实现第五届蓝桥杯LOG大侠
  • 原文地址:https://www.cnblogs.com/justkong/p/6588704.html
Copyright © 2020-2023  润新知