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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM