C++ MAT通道的平均值

C++ MAT通道的平均值,c++,image-processing,opencv,computer-vision,C++,Image Processing,Opencv,Computer Vision,我想得到MAT和MatND变量的平均值,只是为了估计清晰度和亮度。然而,我一直面临着现实问题,我遇到了模糊的价值观。我尽了最大的努力,但仍然感到困惑。我真的不知道,我是否做了正确的事情 calcHist(&src_yuv,1,channels,Mat(),hist,1,histSize,ranges,true,false); Size d = hist.size(); rows = d.height; cols = d.width; for(int

我想得到MAT和MatND变量的平均值,只是为了估计清晰度和亮度。然而,我一直面临着现实问题,我遇到了模糊的价值观。我尽了最大的努力,但仍然感到困惑。我真的不知道,我是否做了正确的事情

    calcHist(&src_yuv,1,channels,Mat(),hist,1,histSize,ranges,true,false);
    Size d = hist.size();
    rows = d.height;
    cols = d.width;
    for(int k=0;k<hbins;k++)
    {
     for(int l=0;l<sbins;l++)
     {
       total = total + hist.at<float>(k,l);
     }
    }
    brightness = total/(rows*cols);
calcHist(&src_yuv,1,channels,Mat(),hist,1,histSize,ranges,true,false);
大小d=历史大小();
行=d.高度;
cols=d.宽度;

对于(int k=0;k在calcHist之前将输入src_yuv转换为BGR,您将使用相同的代码获得所需的输出

编辑:对于YUV:-

out = imread("Lena.jpg");
out.convertTo(out, CV_RGB2YCrCb);
MatND hist;
int hbins = 30, sbins = 32;
int histSize[] = {hbins, sbins};
float hranges[] = { 0, 180 };
float sranges[] = { 0, 256 };
 int channels[] = {0,1,2};
const float* ranges[] = { hranges, sranges };
calcHist( &out, 1, channels, Mat(), 
         hist, 2, histSize, ranges,
         true, 
         false );
Size d = hist.size();
int rows = d.height;
int cols = d.width;
float total;
float brightness;
for(int k=0;k<hbins;k++)
{
    for(int l=0;l<sbins;l++)
    {
        total = total + hist.at<float>(k,l);
    }
}
brightness = total/(rows*cols);
out=imread(“Lena.jpg”);
out.convertTo(out,CV_RGB2YCrCb);
成熟的历史;
int hbins=30,sbins=32;
int histSize[]={hbins,sbins};
float-hranges[]={0,180};
float sranges[]={0,256};
int通道[]={0,1,2};
常量浮点*范围[]={hranges,sranges};
计算和输出,1,通道,垫(),
历史,2,历史大小,范围,
是的,
假);
大小d=历史大小();
int行=d高度;
int cols=d.宽度;
浮动总额;
浮动亮度;

for(int k=0;kMy)的唯一目的是使用YUV来计算亮度。你能告诉我怎么做吗?我不确定wat Am说的是否正确,但通过使用所有3个通道,我能得到亮度的准确估计值吗?我一直试图单独使用Luma('Y')通道。如果使用通道={0},你能告诉我吗,我使用的是luma通道吗?从你对另一个问题的回答中,我引用:“如果你从BGR中的图像开始,并使用BGR2YUV进行转换,那么你相信Y通道是第一个通道,依此类推。如果OpenCV将BGR2YUV更改为Y到最后一个通道,依此类推,那么对你来说太糟糕了。”看看我做了什么。转换是从BGR到YUV的,因此只有在执行channel={0}时才能得到Y通道非常感谢您的耐心,我能够理解这个频道和转换问题。我最后的困惑是关于平均值。您能帮助我吗?我仍在尝试不同的方法。您能检查编辑吗?平均值(InputArray src,InputArray mask=noArray())将为您提供Mat src的平均值
out = imread("Lena.jpg");
out.convertTo(out, CV_RGB2YCrCb);
MatND hist;
int hbins = 30, sbins = 32;
int histSize[] = {hbins, sbins};
float hranges[] = { 0, 180 };
float sranges[] = { 0, 256 };
 int channels[] = {0,1,2};
const float* ranges[] = { hranges, sranges };
calcHist( &out, 1, channels, Mat(), 
         hist, 2, histSize, ranges,
         true, 
         false );
Size d = hist.size();
int rows = d.height;
int cols = d.width;
float total;
float brightness;
for(int k=0;k<hbins;k++)
{
    for(int l=0;l<sbins;l++)
    {
        total = total + hist.at<float>(k,l);
    }
}
brightness = total/(rows*cols);