2

ビデオモーション拡大アルゴリズムを含むプロジェクトに取り組んでいます。現在、riesz ピラミッドを使用して位相ベースのモーション倍率を理解しようとしています。私の主な情報源は次のドキュメントです。

高速位相ベースのビデオ拡大のためのリース ピラミッド \

この論文の結果の一部を再現するために、次の手順を実行しました。

  1. 提供された riesz ピラミッド用の matlab コードを使用して、イメージを複数のスケールに分解します。

  2. ペーパーで導入された近似 riesz 変換を使用して、ピラミッドの ​​1 つのサブバンドを [-0.5, 0, 0.5] および [-0.5, 0, 0.5]' で畳み込むことにより、イメージ Riesz1 および Riesz2 を生成します。

  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. これまでのところ、私の結果が正しいと仮定します。モーションを拡大するには、ローカル フェーズを決定できるだけでなく、それを変更する必要もあります。明らかな何かを見逃しているようですが、どうすればそれを解決できますか? 何らかの形でピラミッド サブバンド ピクセルの位相を変更してから、ピラミッドを折りたたむ必要がありますか? はいの場合、どのように?

私は(明らかに)このトピックにまったく慣れておらず、画像処理の基本的な理解しかありません。私の問題の解決策であろうと、他の有用な情報源への紹介であろうと、どんな回答にも非常に感謝しています.

心から

4

3 に答える 3

1

高速位相ベースのビデオ モーション拡大のために、Riesz Pyramids の方法論を完全に実装しました。論文には、位相を正しくフィルタリングするために必要な適切な手順が明確に記載されていないと感じました。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).
于 2016-03-05T18:28:43.413 に答える
0

DrMcCleod の回答は直接的な解決策にはなりませんでしたが、彼は正しい道を進んでいたようです。

画像の複雑な表現は、入力と次の直交ペアから構築できます。

complexImg = complex(I, Q);

画像の位相シフト再構成は、複素表現に e^(-i*shift) を乗算することによって生成できます。これにより、表現の複素部分が削除され、元の画像と導入された位相シフトが得られます。

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

少し実験する必要がありますが、これで期待どおりの結果が得られるようです。

助けてくれてありがとう!

于 2015-04-09T15:58:31.860 に答える