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圖像才是正確的。
參考:
