Я не уверен в своей средней функции. В Matlab среднее значение моего изображения 135.3565
используя mean2
; однако моя функция дает 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.
Функция mean2 в Matlab делает двухмерное изображение (в градациях серого). Ваша функция предполагает, что изображение является 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 вычисляет среднее значение каждого канала изображения в отдельности, поэтому результатом является вектор средних значений каждого канала.
Я надеюсь, это поможет!
Других решений пока нет …