Почему эти функции гистограммы отличаются и почему одна недетерминированная?

ПРИМЕЧАНИЕ. Это домашнее задание, и профессор прямо запрещает запрашивать ответы у StackOverflow, поэтому, пожалуйста, ограничьте свой ответ конкретным вопросом, который я задал, и не пытайтесь найти рабочее решение.

Меня просят реализовать функцию, которая вычисляет гистограмму 8-битного одноканального изображения, представленного в виде OpenCV Mat с типом CV_U8,

В этом случае гистограмма использует 256 равномерно распределенных сегментов. Это ссылка, которую мы собираемся тиражировать (используя OpenCV 3.4):

Mat reference;

/// Establish the number of bins
int histSize = 256;

/// Set the ranges ( for B,G,R) )
float range[] = { 0, 256 } ;
const float* histRange = { range };

bool uniform = true;
bool accumulate = false;

cv::calcHist(&bgr_planes[0], 1, 0, Mat(), reference, 1, &histSize, &histRange,
uniform, accumulate);

// reference now contains the canonical histogram of the input image's
// blue channel

Я написал следующую функцию для расчета гистограммы, которая дает правильные результаты 45-69% времени (р<0,05, n = 66). Однажды, когда это не удалось, я проверил результаты и не обнаружил заметной закономерности. Все испытания проводились на одном и том же тестовом изображении.

Mat myCalcHist(const Mat& input) {
assert(input.isContinuous());

Mat res(256, 1, CV_32F);
for (const uint8_t* it = input.datastart; it != input.dataend; ++it) {
++res.at<float>(*it);
}

return res;
}

Следующая функция, с другой стороны, более точно соответствует внутренней реализации OpenCV в том смысле, что она использует идиоматические средства доступа и преобразует float результат от int рабочая матрица, но при n = 66 испытаниях она не дала правильного результата ни разу. Опять же, я не обнаружил никаких видимых закономерностей в данных.

Mat myCalcHist(const Mat& input) {

Mat ires(256, 1, CV_32S);
for (int i = 0; i < input.total(); ++i) {
++ires.at<int>(input.at<uint8_t>(i));
}

Mat res(256, 1, CV_32F);
ires.convertTo(res, CV_32F);
return res;
}

Почему результаты для моей первой реализации отличаются от результатов моей второй реализации, и где недетерминизм введен в первую реализацию?

-1

Решение

инициализация матрицы гистограмм должна работать:

Mat myCalcHist(const Mat& input)
{
Mat ires = cv::Mat::zeros(256, 1, CV_32S);
for (int i = 0; i < input.total(); ++i)
{
++ires.at<int>(input.at<uint8_t>(i));
}

Mat res(256, 1, CV_32F);
ires.convertTo(res, CV_32F);
return res;
}
0

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

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

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