Выравнивание видоискателя

Кто-нибудь работал с методом выравнивания видоискателя? Первый шаг (Обнаружение границ) более или менее понятен. Написано, что "для извлечения краев мы берем квадрат градиента изображения в четырех равноотстоящих направлениях: горизонтальном, вертикальном и двух диагональных направлениях" (1). И "затем мы выполняем интегральную проекцию каждого градиентного изображения в направлении, перпендикулярном направлению градиента" (2). Для горизонтального направления я реализовал этот алгоритм следующим образом:

function pl = horgrad(a)
[h,w] = size(a);
b = uint8(zeros(h,w));
for i = 1 : h
        for j = 2 : w
                % abs() instead of squaring
                b(i,j) = abs(a(i,j) - a(i,j-1));     % (1)
        end
end
pl = sum(b);     % (2)

Настоящей проблемой для меня является второй шаг: Выравнивание краев. Что означают px[i]1, py[i]1, pu[i]1 и pv[i]1< /эм>? Почему они равны 1? Как меняется i-счетчик?


person 108rom    schedule 17.12.2011    source источник
comment
Вместо двойного цикла вы можете просто сделать b(:,2:end)=abs(diff(a,1,2));   -  person yuk    schedule 19.12.2011
comment
Да, спасибо. Буду иметь в виду этот лайфхак. Но я все еще использую этот вариант: b(1:h,2:w) = abs(a(1:h,2:w) - a(1:h,1:w-1));У него такая же скорость. А также более понятно.   -  person 108rom    schedule 19.12.2011


Ответы (1)


Насколько я понимаю алгоритм, px, py, pu и pv являются целыми проекциями в каждом из 4 направлений. Итак, px — это pl в вашем коде. px[i]0 — это каждая точка этого вектора — pl(i) в коде. px[i]1 — получить общее количество точек, использованных для создания проекции (коэффициент нормализации?). Таким образом, сумма всех px[i]1 будет высотой изображения h. Для другого направления аналогично.

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

b(:,2:end)=abs(diff(a,1,2));
person yuk    schedule 19.12.2011
comment
Хорошо, я понял :) Наконец, чтобы вычислить корреляцию между диагональными проекциями, я использую массивы с двумя строками. Первая строка — это сама проекция, вторая — значения, полученные из length(diag(image,k)), где k = 0 представляет главную диагональ, k › 0 выше главной диагонали и k ‹ 0 ниже главной диагонали. Давайте сделаем все остальное. - person 108rom; 19.12.2011