我不确定我的均值函数。在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函数分别计算图像的每个通道的平均值,因此结果是每个通道平均值的向量。
我希望这会有所帮助!