значит изображения opencv?

Я не уверен в своей средней функции. В 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;
}

0

Решение

Я предполагаю, что вы передаете один тип изображения в 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 вычисляет среднее значение каждого канала изображения в отдельности, поэтому результатом является вектор средних значений каждого канала.

Я надеюсь, это поможет!

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]