1. 爲何要獲取圖片的亮度?有哪些應用場合?
在工廠或者其他工業生產過程中,需要提取目前場景的亮度。比如,檢測手機的閃光燈功能是否正常。
2. 算法實現
2.1 圖象轉成HSV格式
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%(白)。
我們可以將圖象轉成HSV格式,利用明度V進行計算。步驟如下,
1. 將圖像轉成HSV格式;
2. 提取明度V並計算其均值。
這樣就可以取得圖象的亮度值。當然,也可以根據需要對圖象的局部進行亮度的計算。
Android示例代碼如下,
private void getBrightnessHsv() {
Mat src = new Mat();
Mat hsv = new Mat();
Utils.bitmapToMat(selectbp, src);
Imgproc.cvtColor(src, hsv, Imgproc.COLOR_RGB2HSV);
Scalar avg =Core.mean(hsv);
Toast.makeText(this, "the average brightness(HSV) is " + avg.val[2], Toast.LENGTH_LONG).show();
}
2.2 圖象轉成灰度圖
灰度圖,Gray Scale Image 或是Grey Scale Image,又稱灰階圖。把白色與黑色之間按對數關係分爲若干等級,稱爲灰度。灰度分爲256階。
什麼叫灰度圖?任何顏色都有紅、綠、藍三原色組成,假如原來某點的顏色爲RGB(R,G,B),那麼,我們可以通過下面幾種方法,將其轉換爲灰度:
1.浮點算法:Gray=R*0.3+G*0.59+B*0.11
2.整數方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.僅取綠色:Gray=G;
通過上述任一種方法求得Gray後,將原來的RGB(R,G,B)中的R,G,B統一用Gray替換,形成新的顏色RGB(Gray,Gray,Gray),用它替換原來的RGB(R,G,B)就是灰度圖了。
這裏我們使用OpenCV提供的函數來轉換爲灰度圖,步驟如下,
1. 轉成灰度圖
2. 計算灰度圖的均值。
下面看看網上的一份sample code(C),代碼參考鏈接如下,
https://blog.csdn.net/donger_soft/article/details/39522599?utm_source=blogxgwz9
double get_avg_gray(IplImage *img)
{
IplImage *gray = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
cvCvtColor(img,gray,CV_RGB2GRAY);
CvScalar scalar = cvAvg(gray);
cvReleaseImage(&gray);
return scalar.val[0];
}
下面是Android中的代碼,
private void getBrightnessGray() {
Mat src = new Mat();
Mat gray = new Mat();
Utils.bitmapToMat(selectbp, src);
Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
Scalar avg =Core.mean(gray);
Toast.makeText(this, "the average brightness(Gray) is " + avg.val[0], Toast.LENGTH_LONG).show();
}
兩種方式都可以,大家可以運行代碼進行對比,算出的值差不多。