OpenCV对比两张图片的平均亮度和亮度的标准差

环境是XP VS2010 OpencV3.1.0

下面代码计算了图片的平均亮度和亮度的标准差

思路:灰度就当作是亮度。平均亮度就是每个像素的灰度相加并除以总像素。标准差公式可百度……

还有个图片的亮度,可参考https://blog.csdn.net/zhang11wu4/article/details。其他地方都是只计算算术平均。这里使用了公式。

 

#include <iostream>
#include <ctime>
#include <cmath>

using namespace std;

#include <opencv2/core/core.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc.hpp"


using namespace cv;





//hide the local functions in an anon namespace
/*namespace {
	double LumAvg = 0 ;

}*/

double GetGrayImagAvg(cv::Mat imageSrc)
{
	
	unsigned char* row_ptr;
	unsigned char* data_ptr;
    double sum = 0;  
    double avg = 0;  
	double lumavg = 0;

    if (imageSrc.type() != CV_8UC1 )
    {
        cout<<"please input a gray image."<<endl;
        return 0;
    }
    for ( size_t y=0; y<imageSrc.rows; y++ )
    {
        for ( size_t x=0; x<imageSrc.cols; x++ )
        {
            row_ptr = imageSrc.ptr<unsigned char> ( y ); 
            data_ptr = &row_ptr[ x*imageSrc.channels() ]; 
            for ( int c = 0; c != imageSrc.channels(); c++ )
            {
				sum += data_ptr[c];
				lumavg += log(0.0001 + data_ptr[c]);
            }
        }
    }
    // lumavg: please refer to https://blog.csdn.net/zhang11wu4/article/details/8834747
    lumavg = lumavg / (imageSrc.rows * imageSrc.cols);
    lumavg = exp(avg);
    avg = sum/(imageSrc.rows * imageSrc.cols);   
    return avg;
}
double GetGrayImagStandardDeviation(cv::Mat imageSrc, double GrayImagAvg)
{
	unsigned char* row_ptr;
	unsigned char* data_ptr;
    double stdDvtn = 0;
    if (imageSrc.type() != CV_8UC1 )
    {
        cout<<"please input a gray image."<<endl;
        return 0;
    }
    for ( size_t y=0; y<imageSrc.rows; y++ )
    {
        for ( size_t x=0; x<imageSrc.cols; x++ )
        {
             row_ptr = imageSrc.ptr<unsigned char> ( y ); 
             data_ptr = &row_ptr[ x*imageSrc.channels() ];
            for ( int c = 0; c != imageSrc.channels(); c++ )
            {
				stdDvtn += ( data_ptr[c] - GrayImagAvg )*( data_ptr[c] - GrayImagAvg );
            }
        }
    }
    stdDvtn = stdDvtn/(imageSrc.rows * imageSrc.cols);  
    stdDvtn = sqrt(stdDvtn);
    return  stdDvtn;
}
int main ( int argc, char** argv )
{
	double LumAvg;
	double LumSd;
    cv::Mat imageLEDon, imageLEDoff, imageLEDon_rsz, imageLEDoff_rsz;
    imageLEDon = cv::imread ( "E:\\FENG\\workspace_vc10\\LED_status_detect\\Image\\l1_on.jpg" , IMREAD_GRAYSCALE);
    imageLEDoff = cv::imread ( "E:\\FENG\\workspace_vc10\\LED_status_detect\\Image\\l1_off.jpg", IMREAD_GRAYSCALE ); 

    if(imageLEDon.empty())
    {
		cerr<<" image input error ."<<endl;
        return 0;
    }
    if(imageLEDoff.empty())
    {
	cerr<<" image input error ."<<endl;
        return 0;
    }
    cout << "CV_VERSION: " << CV_VERSION << endl << endl;

    cv::resize(imageLEDon, imageLEDon_rsz, cv::Size(), 1, 1);
    cv::resize(imageLEDoff, imageLEDoff_rsz, cv::Size(), 1, 1);
    cout<<"imageLEDon_rsz col: "<<imageLEDon_rsz.cols<<",row: "<<imageLEDon_rsz.rows<<",channel: "<<imageLEDon_rsz.channels()<<endl;
    cout<<"imageLEDoff_rsz col:"<<imageLEDoff_rsz.cols<<",row: "<<imageLEDoff_rsz.rows<<", channel: "<<imageLEDoff_rsz.channels()<<endl;

    cv::imshow ( "imageLEDon_rsz", imageLEDon_rsz );
    cv::imshow ( "imageLEDoff_rsz", imageLEDoff_rsz );


    LumAvg = GetGrayImagAvg(imageLEDon_rsz);
    LumSd  = GetGrayImagStandardDeviation(imageLEDon_rsz, LumAvg);
    cout<<"imageLEDon_rsz LumAvg:  "<< LumAvg << endl;
    cout<<"imageLEDon_rsz LumStdDeviation:  "<< LumSd << endl<< endl;

    LumAvg = GetGrayImagAvg(imageLEDoff_rsz);
    LumSd  = GetGrayImagStandardDeviation(imageLEDoff_rsz, LumAvg);
    cout<<"imageLEDoff_rsz LumAvg:  "<< LumAvg << endl;
    cout<<"imageLEDoff_rsz LumStdDeviation:  "<< LumSd << endl<< endl;

    cv::waitKey ( 0 ); 
    cv::destroyAllWindows();
    return 0;
}

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值