Я работаю над проектом, связанным с алгоритмами увеличения видео движения. В настоящее время я пытаюсь понять увеличение движения на основе фазы с использованием пирамиды Рисса. Моим основным источником информации является этот документ:
Пирамиды Рисса для быстрого фазового увеличения видео \
Я выполнил следующие шаги, чтобы попытаться воспроизвести некоторые результаты в статье:
Разложите изображение на несколько масштабов, используя предоставленный код Matlab для пирамиды Рисса.
Сгенерируйте изображения Riesz1 и Riesz2 путем свертки одного поддиапазона пирамиды с [-0,5, 0, 0,5] и [-0,5, 0, 0,5]', используя приближенное преобразование Рисса, представленное в статье.
Определите преобладающую локальную ориентацию в каждом пикселе поддиапазона путем вычисления atan(R2/R1). Этот расчет получен из уравнения 3 в статье.
Направьте преобразование на доминирующую локальную ориентацию и вычислите результирующую квадратурную пару.
Используйте квадратурную пару, чтобы сгенерировать комплексное число (I + iQ), фаза которого I затем используется для определения локальной фазы в конкретном пикселе.
Это код Matlab, который я создал:
%Generate a circle image
img = zeros(512, 512);
img(:) = 128;
rad = 180;
for i = size(img, 1)/2 - rad : size(img,1)/2 + rad
for j = size(img, 2)/2 - rad : size(img,2)/2 + rad
deltaX = abs(size(img, 1)/2 - i);
deltaY = abs(size(img, 2)/2 - j);
if (sqrt(deltaX^2+deltaY^2) <= rad)
img(i, j) = 255;
end
end
end
%build riesz pyramid
[pyr, pind] = buildNewPyr(img);
%extract band2 from pyramid (no orientation information yet)
I = pyrBand(pyr,pind,3);
%convolve band2 with approximate riesz filter for first quadrature pair
%element
R1 = conv2(I, [0.5, 0, -0.5], 'same');
%convolve band2 with approximate riesz filter (rotated by 90°) for second
%quadrature pair element
R2 = conv2(I, [0.5, 0, -0.5]', 'same');
% show the resulting image containing orientation information!
% imshow(band2_r2, []);
%To extract the phase, we have to steer the pyramid to its dominant local
%orientation. Orientation is calculated as atan(R2/R1)
theta = atan(R2./R1);
theta(isnan(theta) | isinf(theta)) = 0;
%imshow(theta, []);
% create quadrature pair
Q = zeros(size(theta, 1), size(theta, 2));
for i = 1:size(theta, 1)
for j = 1:size(theta, 1)
if theta(i, j) ~= 0
%create rotation matrix
rot_mat = ...
[cos(theta(i, j)), sin(theta(i, j));...
-sin(theta(i, j)) cos(theta(i, j))];
%steer to dominant local orientation(theta) and set Q
resultPair = rot_mat*[R1(i, j), R2(i,j)]';
Q(i,j) = resultPair(1);
end
end
end
% create amplitude and phase image
A = abs(complex(I, Q));
Phi = angle(complex(I, Q));
Сгенерированные изображения выглядят следующим образом:
Теперь мои вопросы:
При вычислении тета с использованием atan(R2/R1) я получаю много артефактов в результате (см. изображение «доминирующая ориентация»). Есть ли что-то очевидное, что я здесь упускаю/делаю неправильно?
Предполагая, что мои результаты верны до сих пор. Чтобы увеличить движение, мне нужно уметь не только определять локальную фазу, но и изменять ее. Кажется, я упускаю что-то очевидное, но как мне это сделать? Нужно ли как-то изменить фазу пикселей поддиапазона пирамиды, а затем свернуть пирамиду? Если да, то как?
Я (очевидно) совершенно новичок в этой теме и имею только элементарное представление об обработке изображений. Буду очень благодарен за любой ответ, будь то решение моих проблем или просто ссылка на другой полезный источник информации.
Искренне