Интегральное изображение можно легко вычислить, сначала интегрируя по одной оси, а затем интегрируя результат по другой оси. Этот 1D интеграл вычисляется с cumsum
:
out = cumsum(image,1);
out = cumsum(out,2);
Обратите внимание, что если image
имеет целочисленный тип, это может привести к переполнению. Вы должны сначала преобразовать такой массив в double
.
Наконец, для отображения результата вам нужно использовать
imshow(out,[])
в противном случае вы не увидите полный диапазон данных, и все, что выше 1, станет белым, как вы видели с результатом MATLAB.
Относительно вашего кода:
Проблема в переполнении. Преобразуйте значение, взятое из input
, в двойное число первым. В MATLAB uint8(150)+150 == uint8(255)
. Это приводит к чередованию строк и столбцов, как вы видите: одним шагом вы вычитаете какое-то большое значение из частичных сумм, что приводит к небольшому значению, следующим шагом вычитаете небольшое значение, приводящее к большому значению и т. Д.
Сначала меня смутила ваша первая строка и столбец в выходных данных, которые остаются на 0. Но потом я заметил, что выходной сигнал на единицу больше входного, и вы используете этот первый столбец, чтобы избежать особых случаев.
Подумайте об обрезке первой строки и столбца из вашего вывода.
Относительно порядка циклов: быстрее, когда внутренний цикл находится над первым измерением, поскольку к данным обращаются в порядке хранения и, следовательно, лучше используют кэш. Это не должно повлиять на результат, только время.