從 RGB 到 HSL 或 HSV 的轉(zhuǎn)換
設(shè) (r, g, b) 分別是一個(gè)顏色的紅、綠和藍(lán)坐標(biāo),它們的值是在 0 到 1 之間的實(shí)數(shù)。設(shè) max 等價(jià)于 r, g 和 b 中的最大者。設(shè) min 等于這些值中的最小者。要找到在 HSL 空間中的 (h, s, l) 值,這里的 h ∈ [0, 360)度是角度的色相角,而 s, l ∈ [0,1] 是飽和度和亮度,計(jì)算為:

(1)Matlab RGB轉(zhuǎn)換為HSV
I = imread('Lena.jpg'); HSV = rgb2hsv(I); H = HSV(:, :, 1); S = HSV(:, :, 2); V = HSV(:, :, 3); figure; subplot(2, 3, 1); imshow(I); //subplot(2, 3, 2); imshow(HSV); subplot(2, 3, 4); imshow(H); subplot(2, 3, 5); imshow(S); subplot(2, 3, 6); imshow(V);
(2)Opencv中RGB轉(zhuǎn)換為HSV
// BRGtoHSVShow.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 //
//#include "stdafx.h" #include "cv.h" #include "cxcore.h" #include "highgui.h" #include "cvaux.h"
int main( ) { IplImage* src = NULL; IplImage* floatsrc = NULL; IplImage* floathsv = NULL; IplImage* floatimgH = NULL; IplImage* floatimgS = NULL; IplImage* floatimgV = NULL;
cvNamedWindow( "src", 1 ); cvNamedWindow( "H通道", 1 ); cvNamedWindow( "S通道", 1 ); cvNamedWindow( "V通道", 1 );
src = cvLoadImage( "lena.jpg", -1); cvShowImage( "src", src ); CvSize size = cvGetSize( src );
//先將圖像轉(zhuǎn)換成float型的 floatsrc = cvCreateImage( size, IPL_DEPTH_32F, 3 ); floathsv = cvCreateImage( size, IPL_DEPTH_32F, 3 ); floatimgH = cvCreateImage( size, IPL_DEPTH_32F, 1 ); floatimgS = cvCreateImage( size, IPL_DEPTH_32F, 1 ); floatimgV = cvCreateImage( size, IPL_DEPTH_32F, 1 );
//將src從8位轉(zhuǎn)換到32位的float型 cvConvertScale( src, floatsrc, 1.0/255.0, 0 );//歸一化之后方能夠顯示 //cvConvertScale( src, floatsrc, 1, 0 ); //cvShowImage("floatsrc",floatsrc); //cvWaitKey(-1);
//將float型圖像 從BGR轉(zhuǎn)換到HSV 如果需要轉(zhuǎn)換到其他的顏色空間 那么改變CV_BGR2HSV即可 //cvCvtColor要求兩個(gè)參數(shù)的類型必須完全相同,所以要轉(zhuǎn)為float型 cvCvtColor( floatsrc, floathsv, CV_BGR2HSV );
//將三通道圖像 分解成3個(gè)單通道圖像,H對(duì)應(yīng)的通道時(shí)0,S、V對(duì)應(yīng)的通道時(shí)1和2 //cvCvtPixToPlane(picHSV, h_plane, s_plane, v_plane, 0); cvSplit( floathsv, floatimgH, floatimgS, floatimgV, NULL);
cvShowImage( "src", src ); cvShowImage( "H通道", floatimgH ); cvShowImage( "S通道", floatimgS ); cvShowImage( "V通道", floatimgV ); //CV_BGR2HSV
cvWaitKey( 0 );
cvReleaseImage( &src ); cvReleaseImage( &floathsv ); cvReleaseImage( &floatimgH ); cvReleaseImage( &floatimgS ); cvReleaseImage( &floatimgV );
return 0; }
參考資料:
http://blog.163.com/my_it_dream_pwj/blog/static/178414305201131310153036/
http://www./thread-95980-1-1.html
http://blog.sina.com.cn/s/blog_658cfb1d01014fv5.html
http://zhidao.baidu.com/question/259749959.html
http://www./forum/viewtopic.php?t=4032 http://zh./wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4
|