Содержимое изображения со сдвигом фазы после анализа с помощью преобразования Рисса

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

Пирамиды Рисса для быстрого фазового увеличения видео \

Я выполнил следующие шаги, чтобы попытаться воспроизвести некоторые результаты в статье:

  1. Разложите изображение на несколько масштабов, используя предоставленный код Matlab для пирамиды Рисса.

  2. Сгенерируйте изображения Riesz1 и Riesz2 путем свертки одного поддиапазона пирамиды с [-0,5, 0, 0,5] и [-0,5, 0, 0,5]', используя приближенное преобразование Рисса, представленное в статье.

  3. Определите преобладающую локальную ориентацию в каждом пикселе поддиапазона путем вычисления atan(R2/R1). Этот расчет получен из уравнения 3 в статье.

  4. Направьте преобразование на доминирующую локальную ориентацию и вычислите результирующую квадратурную пару.

  5. Используйте квадратурную пару, чтобы сгенерировать комплексное число (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));

Сгенерированные изображения выглядят следующим образом:

Сгенерированные изображения

Теперь мои вопросы:

  1. При вычислении тета с использованием atan(R2/R1) я получаю много артефактов в результате (см. изображение «доминирующая ориентация»). Есть ли что-то очевидное, что я здесь упускаю/делаю неправильно?

  2. Предполагая, что мои результаты верны до сих пор. Чтобы увеличить движение, мне нужно уметь не только определять локальную фазу, но и изменять ее. Кажется, я упускаю что-то очевидное, но как мне это сделать? Нужно ли как-то изменить фазу пикселей поддиапазона пирамиды, а затем свернуть пирамиду? Если да, то как?

Я (очевидно) совершенно новичок в этой теме и имею только элементарное представление об обработке изображений. Буду очень благодарен за любой ответ, будь то решение моих проблем или просто ссылка на другой полезный источник информации.

Искренне


person BoltzmannBrain    schedule 04.04.2015    source источник
comment
Привет! Вы продолжили работу в этом направлении? Какой-нибудь базовый совет (и некоторые интересные ресурсы - исходный код/документы) для тех, кто пытается понять и работать в этой области? Спасибо!   -  person radu-matei    schedule 06.09.2015
comment
@Matei_Radu Вы имеете в виду сигнальный сигнал / обработку видео в целом или увеличение движения? Для последних есть несколько интересных ресурсов. Вот документ, в котором обсуждается лагранжев подход, основанный на алгоритмах оптического потока: people.csail. mit.edu/billf/publications/ Здесь представлен более свежий эйлеровский подход с использованием вариаций интенсивности, для которого доступна рабочая демонстрация MATLAB: people.csail.mit.edu/mrub/papers/vidmag.pdf   -  person BoltzmannBrain    schedule 06.09.2015
comment
Я говорю об увеличении движения, да. Я прочитаю газету, которую вы мне прислали, и вернусь к вам. Спасибо за это. Любые ресурсы, которые вы можете придумать, которые касаются этой темы, приветствуются! Удачи!   -  person radu-matei    schedule 06.09.2015
comment
Я добавил немного информации. Кроме того, на основе первого эйлерова подхода, о котором я упоминал, есть документ, в котором обсуждается эйлеровский подход с использованием сложных фазовых вариаций: people.csail.mit.edu/nwadhwa/phase-video/phase-video.pdf И, исходя из этого, у нас есть увеличение движения Рисса, о котором я упоминал в оригинале. вопрос. Я действительно закончил реализацию алгоритма в своем программном обеспечении. Это очень, очень интересная тема! Кроме того, я бы рекомендовал вам начать с первой статьи, посвященной эйлерову подходу. Это наименее сложно, и предоставленный код MATLAB полезен.   -  person BoltzmannBrain    schedule 06.09.2015
comment
Удалось ли вам визуализировать видео с увеличением видео с помощью пирамиды Рисса?   -  person radu-matei    schedule 06.09.2015
comment
У меня была работающая реализация, однако были серьезные артефакты, которые я не мог вовремя устранить. Поэтому я выбрал альтернативу, используя сложную управляемую пирамиду (второй подход Эйлера, который я связал), который работает замечательно хорошо и способен увеличивать движение в реальном времени даже на слабом оборудовании.   -  person BoltzmannBrain    schedule 06.09.2015


Ответы (3)


У меня есть работающая реализация этого алгоритма. Вот шаги, которые я предпринял, чтобы успешно увеличить видео с помощью этого метода.

Эти шаги должны быть применены к каждому каналу видеопоследовательности, которую вы используете (я пробовал это для видео RGB, вы, вероятно, могли бы сделать это только для яркости в видео YUV).

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

  2. Для каждого уровня пирамиды каждого видеоканала вычислите преобразование Рисса (см. Преобразование Рисса и одновременные представления фазы, энергии и ориентации в пространственном видении для обзора преобразования и см. статью в исходном вопросе для эффективной приблизительной реализации).

  3. Используя преобразование Рисса, вычислите локальную амплитуду, ориентацию и фазу для каждого пикселя каждого уровня пирамиды каждого видеокадра. Следующий код Matlab будет вычислять локальную ориентацию, фазу и амплитуду изображения (двойного формата), используя приблизительное преобразование Рисса:

    function [orientation, phase, amplitude] = riesz(image)
    
    [imHeight, imWidth] = size(image);
    
    %approx riesz, from Riesz Pyramids for Fast Phase-Based Video Magnification
    
    dxkernel = zeros(size(image));
    dxkernel(1, 2)=-0.5;
    dxkernel(1,imWidth) = 0.5;
    
    
    dykernel = zeros(size(image));
    dykernel(2, 1) = -0.5;
    dykernel(imHeight, 1) = 0.5;
    
    R1 = ifft2(fft2(image) .* fft2(dxkernel));
    R2 = ifft2(fft2(image) .* fft2(dykernel));
    
    
    orientation = zeros(imHeight, imWidth);
    phase = zeros(imHeight, imWidth);
    
    orientation = (atan2(-R2, R1));
    
    phase = ((unwrap(atan2(sqrt(R1.^2 + R2.^2) , image))));
    
    amplitude = sqrt(image.^2 + R1.^2 + R2.^2);
    
    end   
    
  4. Для каждого уровня пирамиды временно отфильтруйте значения фазы каждого пикселя, используя полосовой фильтр, настроенный на частоту, подходящую для движения, которое вы хотите увеличить. Обратите внимание, что это удаляет постоянную составляющую из значения фазы.

  5. Рассчитайте усиленное значение фазы по

    amplifiedPhase = phase + (requiredGain * filteredPhase);
    
  6. Используйте усиленную фазу для расчета новых значений пикселей для каждого уровня пирамиды с помощью

    amplifiedSequence = amplitude .* cos(amplifiedPhase);
    
  7. Сверните пирамиды, чтобы создать новый усиленный видеоканал.

  8. Рекомбинируйте ваши усиленные каналы в новый видеокадр.

В оригинальной статье есть еще несколько шагов для улучшения характеристик шума, но приведенная выше последовательность довольно хорошо создает видео с усилением движения.

person DrMcCleod    schedule 09.04.2015
comment
Я разработал очень похожее решение (на самом деле я наткнулся на тот же документ, на который вы ссылаетесь). В исходном документе говорится, что фаза не может быть наивно отфильтрована, а скорее величины Φcos(Ө) и Φsin(Ө). Вы, случайно, так не пробовали? В моих экспериментах это привело к значительному увеличению количества артефактов, предполагая, что я что-то упустил. - person BoltzmannBrain; 19.04.2015
comment
Нет, этого я еще не пробовал. Тем не менее, я могу порекомендовать их альтернативную пирамидальную структуру (а не лапласианскую), поскольку она заметно улучшает результаты. - person DrMcCleod; 20.04.2015

Я полностью реализовал методологию пирамид Рисса для увеличения видео на основе быстрой фазы. Я чувствовал, что в документах нет четкого описания соответствующих шагов, необходимых для правильной фильтрации фазы. Важно понимать, что несколько математически правильных выражений для фазы и ориентации могут фактически не подходить для использования функций MATLAB acos(), asin() и atan(). Вот моя реализация:

% R1, R2 are Riesz transforms of the image I and Q is the Quadrature pair

Q = sqrt((R1.^2) + (R2.^2));

phase = atan2(Q,I);

Фаза должна быть заключена между -pi и +pi, т.е. если фаза больше +pi, фаза = фаза - 2*pi, если фаза меньше -pi,

phase = phase + 2*pi.

amplitude = sqrt((I.^2) + (R1.^2) + (R2.^2));

Кроме того, очень важно, чтобы фильтрулось изменение фазы между последовательными кадрами, а не непосредственно фаза.

phase_diff = phase(t+1) - phase(t);

Эта величина "phase_diff" фильтруется во времени и усиливается путем умножения на коэффициент усиления. Отфильтрованное, усиленное изменение фазы затем используется для фазового сдвига входного сигнала.

magnified output = amplitude.*cos(phase_diff_filtered_amplified + original phase).
person zeekay    schedule 05.03.2016

хотя ответ DrMcCleod не дал прямого решения, похоже, он был на правильном пути.

Комплексное представление изображения может быть построено из входных данных и квадратурной пары с

complexImg = complex(I, Q);

Затем можно сгенерировать реконструкцию изображения со сдвигом по фазе путем умножения сложного представления на e^(-i*shift), что удаляет сложную часть представления и дает исходное изображение плюс введенный фазовый сдвиг.

reconstructed = complexImg*exp(-sqrt(-1) * shift);

Мне придется немного поэкспериментировать, но, похоже, это дает ожидаемые результаты.

Спасибо за помощь!

person BoltzmannBrain    schedule 09.04.2015