环境是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;
}