ラドン変換を用いた回転・拡大の算出(プログラミング言語はMatlabです。)
現在、画像I0に対してI1の画像がどれだけ回転・拡大しているのかというのを算出するプログラムを組もうとしていますが、プログラム途中でゆきずまっています。(ただし、I1はI0をアフィン変換した画像です。)
はじめに理論から説明して、次に自分が作っている途中のプログラムをお見せしようと思います。
以下理論の説明です。
画像I0(x,y)をアフィン変換した画像をI1(x',y')とすると
I0(x,y)=I1(x',y') (1)
x'=s*(x*cosφ-y*sinφ)+Δx (2)
y'=s*(x*sinφ+y*cosφ)+Δy (3)
となります。ここで、s,φ,Δx,Δyはそれぞれ拡大率、回転角、平行移動量とします。
画像それぞれに対して、ラドン変換します。
r0(θ,ρ)=∬I0(x,y)δ(ρ-xcosθ-ysinθ)dxdy (4)
r1(θ,ρ)=∬I1(x',y')δ(ρ-x'cosθ-y'sinθ)dx'dy' (5)
上の4式をとくと、
r1(θ,ρ)=r0(θ-φ,{ρ-tcos(θ-k)}/s) (6)
t=sqrt(Δx^2+Δy^2) (7)
k=tan^-1(Δx/Δy) (8)
となります。
次に、ラドン変換平面をρ軸方向に一次元フーリエ変換した後にパワースペクトルを計算すると、r0(θ,ρ) , r1(θ,ρ)はそれぞれ
R0(θ,f)=|∫r0(θ,ρ)exp(-j2πfρ)dρ| (9)
R1(θ,f)=|∫r1(θ,ρ)exp(-j2πfρ)dρ| (10)
となります。
(5),(9),(10)より、
r1(θ,f)=r0(θ-φ,sf)
の関係が成り立ち、平行移動の影響を取り除けるます。
ここで、
r1(θ,f)=r0(θ-φ,q-λ) (11)
q=ln(f) (12)
λ=-ln(s) (13)
のようにf軸の対数変換を行なうと、拡大、回転の影響がθ、q軸のシフト量として表せます。
これらの理論を踏まえた上で質問が2点あります。
上の対数変換をどうプログラミングすればよいのか分からないのですがどうすればよいでしょうか?
あと、はじめのアフィン変換の(2)式ですが、これをプログラムしようとすると拡大率sやらΔx、Δyなどを定義しなくてはならないのですが、これらは最後に求めるもの、あるいは計算途中で必要なくなるものであって、定義のしようがないのですがどうすればよいでしょうか?
プログラム言語はMatlabです。プログラミング初心者で至らないところがあると思いますが助言の方よろしくお願いします。
以下、プログラミング途中のものです。
*ラドン変換をハフ変換にかえてあります。
A1=imread('tekubi-small.jpg');
A2=imread('tekubi-small.jpg');
A1=imresize(A1,[128 128]); A2=imresize(A2,[128 128]);
B1=rgb2gray(A1);B2=rgb2gray(A2);B2=rot90(B2);
画像B1とをB1を90度回転させたB2とで回転角・拡大率を算出できるか実験しています。
B1=edge(B1,'canny');
B2=edge(B2,'canny');
%ハフ変換
[H, THETA, RHO] = hough(B1);
[H2, THETA2, RHO2] = hough(B2);
%ハフ変換平面をρ軸方向に一次元フーリエ変換する
C1=fft(H,[],1);
C2=fft(H2,[],1);
%パワースペクトルを計算する
C11=abs(C1);
C22=abs(C2);
というところまでやりました。
お礼
ありがとうございます。 早速試してみます。