图像的平均值opencv

mean of an image opencv?

本文关键字:opencv 平均值 图像      更新时间:2023-10-16

我不确定我的均值函数。在Matlab中,通过使用mean2,我的图像的平均值为135.3565;然而,我的函数给出了140.014,OpenCV内置的cv::mean给了我[137.67, 152.467, 115.933, 0]。这是我的密码。

double _mean(const cv::Mat &image)
{
    double N = image.rows * image.cols;
    double mean;
    for (int rows = 0; rows < image.rows; ++rows)
    {
        for (int cols = 0; cols < image.cols; ++cols)
        {
            mean += (float)image.at<uchar>(rows, cols);
        }
    }
    mean /= N;
    return mean;
}

我的猜测是,您将一种类型的图像输入到Matlab,另一种类型输入到算法和opencv内置函数。

Matlab的mean2函数获取2D图像(灰度)。您的函数假设图像是无符号字符的2D矩阵(灰度也是),当您这样做时:

mean += (float)image.at<uchar>(rows, cols);

如果将彩色图像传递给函数,则会检索到不正确的值。在传递给函数之前,尝试将图像转换为灰度,并将结果与Matlab进行比较。

对于彩色图像,将您的功能修改为:

double _mean(const cv::Mat &image)
{
    double N = image.rows * image.cols * image.channels();
    double mean;
    for (int rows = 0; rows < image.rows; ++rows)
    {
        for (int cols = 0; cols < image.cols; ++cols)
        {
            for(int channels = 0; channels < image.channels(); ++channels)
            {
                mean += image.at<cv::Vec3b>(rows, cols)[channels];
            }
        }
    }
    mean /= N;
    return mean;
}

并在Matlab中使用计算平均值

mean(image(:))

它将在计算平均值之前对您的图像进行矢量化。比较结果。

opencv函数分别计算图像的每个通道的平均值,因此结果是每个通道平均值的向量。

我希望这会有所帮助!