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

 

两种方式都可以,大家可以运行代码进行对比,算出的值差不多。

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