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