使用OpenCV獲取圖片亮度

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();
    }

 

兩種方式都可以,大家可以運行代碼進行對比,算出的值差不多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章