從RGB轉到HSV空間中得到:
H:色相 0~360度
S:飽和度 0~1
V:明度 (黑)0~1(白)
在顏色分明的情況時,色相(H)可以很容易地將顏色分離出來
OpenCV也很棒的有RGB轉HSV現成的函式可以使用
不過要注意的是
在U8中,最大值只有255,因此OpenCV有做了調整
H:0~180 H/2
S:0~255 S*255
V:0~255 V*255
編譯環境為:
mac lion mountain 10.8
opencv 2.4.6
Xcode 4.6(在這邊基本上相容visual c++)
下面是code:
// // opencv 2.4.6 Extract Color // // Created by vince on 13/9/30. // Copyright (c) 2013年 vince. All rights reserved. // #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include結果如下圖:#include using namespace cv; using namespace std; int main() { Mat src; //原圖片 Mat hsv; //轉到hsv平面 Mat dst; //結果圖片 Mat r,r2,g,b; //各顏色的閥值 //在hsv空間中 紅255介於 0度和360度交接處(想像成本初經線) 因此宣告r和r2確保不會少掉部分的紅色 src=imread("/Users/mac/Documents/MyCode/OpenCV/opencv 2.4.6 test/opencv 2.4.6 test/color.bmp"); Mat mask=Mat::zeros(src.rows,src.cols, CV_8U); //為了濾掉其他顏色 cvtColor(src,hsv,CV_BGR2HSV);//轉成hsv平面 inRange(hsv,Scalar(0,100,120) , Scalar(10,255,255), r); //二值化:h值介於0~10 & s值介於100~255 & v值介於120~255 inRange(hsv,Scalar(170,100,120) , Scalar(180,255,255), r2); //二值化:h值介於170~180 & s值介於100~255 & v值介於120~255 inRange(hsv,Scalar(50,100,120) ,Scalar(70,255,255), g); //二值化:h值介於50~70 & s值介於100~255 & v值介於120~255 inRange(hsv,Scalar(110,100,120) , Scalar(130,255,255), b); //二值化:h值介於110~130 & s值介於100~255 & v值介於120~255 mask=r+r2+g+b;//全部的二值化圖累加起來就變成遮罩 src.copyTo(dst,mask ); //將原圖片經由遮罩過濾後,得到結果dst imshow("b",b);//show b imshow("mask",mask);//show mask imshow("src",src);//show原圖片 imshow("result",dst);//show結果 waitKey(); }
HSV空間:參考 HSV wiki定義
實際測試發現:
回覆刪除1.r與b好像參數給相反了
2.r2位置也在藍色區域
不過還是感謝分享~謝拉