HSV顏色模型
如果我們想找出一副圖像中的藍色部分,我們需要檢查rgb分量中的blue分量就可以了。一般blue分量是0-255的值,即便藍色分量255了,由于另外兩個分量的影響,需要考慮各個分量的配比問題,rgb作為顏色判斷很難實現,就有了hsv模型hsv,photoshop中hsb
HSV(Hue, Saturation, Value)是根據顏色的直觀特性由A. R. Smith在1978年創建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。這個模型中顏色的參數分別是:色調(H),飽和度(S),明度(V)。
色調H
用角度度量,取值范圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,品紅為300°;
飽和度S
飽和度S表示顏色接近光譜色的程度。一種顏色,可以看成是某種光譜色與白色混合的結果。其中光譜色所占的比例愈大,顏色接近光譜色的程度就愈高,顏色的飽和度也就愈高。飽和度高,顏色則深而艷。光譜色的白光成分為0,飽和度達到最高。通常取值范圍為0%~100%,值越大,顏色越飽和。
亮度V
亮度表示顏色明亮的程度,對于光源色,明度值與發光體的光亮度有關;對于物體色,此值和物體的透射比或反射比有關。通常取值范圍為0%(黑)到100%(白)。
在OpenCV中hsv 數據為8UC則取值分別為 0-180 0-255 0-255 ,即藍色240對應的應該是120
1, 預處理
//src目前是BGR顏色空間,轉換成HSV
Mat hsv;cvtColor(src, hsv, COLOR_BGR2HSV);//imshow("hsv", hsv);
效果
2找藍色像素:h(100-124),s(43-255),v(46-255)
遍歷
獲取通道數
int channels = hsv.channels();int height = hsv.rows;//如下圖,寬度變成了列數乘以3int width = hsv.cols * channels;//如果是連續存儲,按照1行來處理,如下圖,內存地址從0到8為第一行,將下一行看作為一行。if (hsv.isContinuous()) {width *= height;height = 1;}uchar* p;for (int i = 0; i < height; i++){//取第i行的數據p = hsv.ptr<uchar>(i);//每次處理channels個數據,這里j步長為channels,每次都取3個。for (int j = 0; j < width; j += channels) {//獲取 h s v 分量int h = p[j];int s = p[j + 1];int v = p[j + 2];//h(100-124),s(43-255),v(46-255)bool isBlue = false;if (h >= 100 && h <= 124 &&s >= 43 && s <= 255 &&v >= 46 && v <= 255) {isBlue = true;}if (isBlue){//凸顯藍色(v分量最大255)p[j] = 0;//hp[j + 1] = 0;//sp[j + 2] = 255;//v}else {//變黑(v分量為0)p[j] = 0;//hp[j + 1] = 0;//sp[j + 2] = 0;//v}}}// end for//imshow("凸顯藍色", hsv);
處理完之后如圖:
如果是藍色的車,可能就識別不了了。
vector<Mat> hsv_split;split(hsv, hsv_split);//對圖像按通道進行分離 , merge()合并//imshow("分離v分量", hsv_split[2]);//v分離
https://blog.csdn.net/u012819339/article/details/82222008
分離 之后如圖:
分離分量之后,和sobel一樣,進行二值化,閉操作,找輪廓。。。
注意:
之前的是藍色的,還有一種是黃色的。
//藍色車牌:字符淺背景深,正二值化
//黃色車牌:字符深背景淺,反二值化
//二值化Mat shold;//THRESH_OTSU 大律法 自適應閾值//THRESH_BINARY 正二值化//THRESH_BINARY_INV 反二值化//藍色車牌:字符淺背景深,正二值化//黃色車牌:字符深背景淺,反二值化threshold(hsv_split[2], shold, 0, 255, THRESH_OTSU + THRESH_BINARY);//imshow("color二值化", shold);//閉操作Mat close;Mat element = getStructuringElement(MORPH_RECT, Size(17, 3));morphologyEx(shold, close, MORPH_CLOSE, element);//imshow("color閉操作", close);//找輪廓vector<vector<Point>> contours;findContours(close, //輸入圖像contours, //輸出輪廓RETR_EXTERNAL, //外輪廓CHAIN_APPROX_NONE //輪廓上所有像素點);RotatedRect rotatedRect;vector<RotatedRect> vec_color_rects;//遍歷并判斷矩形尺寸Mat src_clone = src.clone();for each (vector<Point> points in contours){rotatedRect = minAreaRect(points);//帶角度的矩形rectangle(src_clone, rotatedRect.boundingRect(), Scalar(0, 0, 255));if (verifySizes(rotatedRect)) {vec_color_rects.push_back(rotatedRect);}}for each (RotatedRect rect in vec_color_rects){rectangle(src_clone, rect.boundingRect(), Scalar(0, 255, 0));}//imshow("color找輪廓", src_clone);//矩形矯正(角度判斷,旋轉矩形,調整大小)tortuosity(src, vec_color_rects, dst_plates);/*for each (Mat m in dst_plates){//imshow("color定位候選車牌", m);//waitKey();}*/
color二值化:
sobel二值化
sobel閉操作(左)和color閉操作(右邊)圖對比
顯然,color閉操作要好一點。
總結
以上是生活随笔為你收集整理的3 OpenCV 车牌识别-2 颜色定位的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。