学习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色系的算法(參考http://zhidao.baidu.com/question/6436440.html):
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 )可以從多通道數組中分離提取一個通道。
參考資料:http://baike.baidu.com/view/541362.htm
? ? ? ? ? ? ? ? ? ? ? ? ?OpenCV中文chm文檔
總結
以上是生活随笔為你收集整理的学习Opencv笔记(二)————hsv色系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt中文件读写进文本框出现乱码问题详解(
- 下一篇: 外汇基础学习1:结售汇