1. 程式人生 > >學習Opencv筆記(二)————hsv色系

學習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文件