學習Opencv筆記(二)————hsv色系
這篇部落格簡單探究一下HSV色系,先簡單介紹HSV色系,然後用程式分割HSV色系的三個特性並演示,最後給出RGB色系到HSV色系轉換的公式,以及OpenCV中函式介紹。(如果有錯誤歡迎糾正,也希望有人和我一起學習交流)
HSV(Hue,Saturation,Value)是根據顏色的直觀特性由A.R.Smith在1978年建立的一種顏色空間,也稱六角錐體模型(Hexcone Model)。HSV色系對使用者來說是一種直觀的顏色模型,對於顏色,人們直觀的會問”什麼顏色?深淺如何?明暗如何?“,而HSV色系則直觀的表示了這些資訊。在許多影象編輯工具中HSV色系應用也比較廣泛,如photoshop等工具。
這個模型中顏色的引數分別是:色調(H),飽和度(S),亮度(V)。
色調H:用角度度量,取值範圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,品紅為300°。一旦顏色從一種顏色進入另一種顏色,人眼將立即發現它。色調是人眼對光主波長的認知;
飽和度S:表示顏色純淨的程度,取值範圍為0.0~1.0;
亮度V:表示顏色的明暗程度,對於單色光,亮度表示了光線的強弱,對於物體,明度表示物體的反射或透射光線的能力,取值範圍為0.0(黑色)~1.0(白色)。
RGB和CMY顏色模型都是面向硬體的,而HSV(Hue Saturation Value)顏色模型是面向使用者的。
HSV模型的三維表示從RGB立方體演化而來。設想從RGB沿立方體對角線的白色頂點向黑色頂點觀察,就可以看到立方體的六邊形外形。六邊形邊界表示色彩,水平軸表示純度,明度沿垂直軸測量。
為了能夠直觀的瞭解HSV色系中H、S、V,下面的程式將幾張jpg影象的色調H、飽和度S、亮度V分割成三張圖片,便於理解。 程式程式碼如下:#include<iostream>
#include "cv.h"
#include "highgui.h"
#include <ctype.h>
using namespace std;
void main()
{
IplImage *image,*hsv,*hue,*saturation,*value;//影象空間
image=cvLoadImage("C:\\Users\\lufee\\Pictures\\cat.jpg");//開啟影象源影象
hsv=cvCreateImage(cvGetSize(image),8,3);//給hsv色系的影象申請空間
hue=cvCreateImage(cvGetSize(image),8,1); //色調
saturation=cvCreateImage(cvGetSize(image),8,1);//飽和度
value=cvCreateImage(cvGetSize(image),8,1);//亮度
cvNamedWindow("image",CV_WINDOW_AUTOSIZE);//用於顯示影象的視窗
cvNamedWindow("hsv",CV_WINDOW_AUTOSIZE);
cvNamedWindow("hue",CV_WINDOW_AUTOSIZE);
cvNamedWindow("saturation",CV_WINDOW_AUTOSIZE);
cvNamedWindow("value",CV_WINDOW_AUTOSIZE);
cvCvtColor(image,hsv,CV_BGR2HSV);//將RGB色系轉為HSV色系
cvShowImage("image",image);
cvShowImage("hsv",hsv);
cvSplit(hsv, hue, 0, 0, 0 );//分離三個通道
cvSplit(hsv, 0, saturation, 0, 0 );
cvSplit(hsv, 0, 0, value, 0 );
cvShowImage("hue",hue);
cvShowImage("saturation",saturation);
cvShowImage("value",value);
cvWaitKey(0);
cvDestroyWindow("image");
cvDestroyWindow("hsv");
cvDestroyWindow("hue");
cvDestroyWindow("saturation");
cvDestroyWindow("value");
return;
}
結果如下 原圖與轉為HSV色系後的圖片(不知道為什麼轉為HSV色系後圖像會變。。。)
分離HSV色系的三通道圖片:
RGB轉化到HSV的演算法:
max=max(R,G,B)
min=min(R,G,B)
if R = max, H = (G-B)/(max-min)
if G = max, H = 2 + (B-R)/(max-min)
if B = max, H = 4 + (R-G)/(max-min)
H = H * 60
if H < 0, H = H + 360
V=max(R,G,B)
S=(max-min)/max
OpenCV中:
cvCvtColor( const CvArr* src, CvArr* dst, int code )函式即可將RGB色系轉換為HSV色系(其中轉化為HSV色系時code的值為 CV_BGR2HSV),src為要轉化的原影象,dst為轉化後存放的影象空間。
cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,CvArr* dst2, CvArr* dst3 )可以從多通道陣列中分離提取一個通道。
OpenCV中文chm文件