Как рассчитать интегральное изображение из оригинала? - PullRequest
0 голосов
/ 03 ноября 2018

Я попытался разделить отдельные каналы изображения, а затем вычислить с помощью рекурсивной функции. В итоге я присоединился к трем каналам:

function [ii] = computeIntegralImage(image)
%function to compute integral from original image
iip=zeros(size(image,1)+1,size(image,2)+1);
jjp=zeros(size(image,1)+1,size(image,2)+1);
kkp=zeros(size(image,1)+1,size(image,2)+1);

for i=2:size(iip,1)
    for j=2:size(iip,2)
        iip(i,j)=image(i-1,j-1,1)+iip(i,j-1)+iip(i-1,j)-iip(i-1,j-1); 
    end
end

for i=2:size(jjp,1)
    for j=2:size(jjp,2)
        jjp(i,j)=image(i-1,j-1,2)+jjp(i,j-1)+jjp(i-1,j)-jjp(i-1,j-1); 
    end
end

for i=2:size(kkp,1)
    for j=2:size(kkp,2)
        kkp(i,j)=image(i-1,j-1,3)+kkp(i,j-1)+kkp(i-1,j)-kkp(i-1,j-1); 
    end
end

ii= cat(3,iip,jjp,kkp);

Выход Matlab для функции integralImage полностью белый:

Matlab Output

Мой вывод - красочное изображение:

My Output

1 Ответ

0 голосов
/ 03 ноября 2018

Интегральное изображение можно легко вычислить, сначала интегрируя по одной оси, а затем интегрируя результат по другой оси. Этот 1D интеграл вычисляется с cumsum:

out = cumsum(image,1);
out = cumsum(out,2);

Обратите внимание, что если image имеет целочисленный тип, это может привести к переполнению. Вы должны сначала преобразовать такой массив в double.

Наконец, для отображения результата вам нужно использовать

imshow(out,[])

в противном случае вы не увидите полный диапазон данных, и все, что выше 1, станет белым, как вы видели с результатом MATLAB.


Относительно вашего кода:

Проблема в переполнении. Преобразуйте значение, взятое из input, в двойное число первым. В MATLAB uint8(150)+150 == uint8(255). Это приводит к чередованию строк и столбцов, как вы видите: одним шагом вы вычитаете какое-то большое значение из частичных сумм, что приводит к небольшому значению, следующим шагом вычитаете небольшое значение, приводящее к большому значению и т. Д.

Сначала меня смутила ваша первая строка и столбец в выходных данных, которые остаются на 0. Но потом я заметил, что выходной сигнал на единицу больше входного, и вы используете этот первый столбец, чтобы избежать особых случаев. Подумайте об обрезке первой строки и столбца из вашего вывода.

Относительно порядка циклов: быстрее, когда внутренний цикл находится над первым измерением, поскольку к данным обращаются в порядке хранения и, следовательно, лучше используют кэш. Это не должно повлиять на результат, только время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...