
現在、画像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);
というところまでやりました。
No.1ベストアンサー
- 回答日時:
仰っている理論通りなら、
明示的にに対数変換の計算をしないでも、そのまま、C11とC22を比べてx方向とy方向にどれだけシフトさせたときに一番ぴったり合うかを調べて、そのシフト量から、φとλを算出すればいいと思います。
ほんとは対数変換するってことを考えると、どこがぴったり合うか調べるときに、低周波成分を高周波成分よりも重みを高くして適合度を調べるとかしたほうがいいかな。
書き込みありがとうございます!
実は上に書いた理論だけがすべてじゃなくて続きがあります。
確かに上の理論だけ見るとシフト量から求められそうですが、(説明不足で申し訳ないです)それだけじゃダメみたいで、の後に、位相限定相関法という手法を用いてシフト量を計算するらしいですが、その前段階でつまづいてしまっている状況です。
上のプログラムからどうやったらできるか教えていただけるとうれしいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
家電製品の電力周波数を変える機械
-
FortranをC++(VC++)へ変換
-
逆コンパイルと逆アセンブルの...
-
.sb3のファイルを.sb2に変換す...
-
VB6で16進のXOR演算
-
VB 6 を VS 2012に変換するには?
-
シーケンサのCPUはニーモニック...
-
UTF8→ShiftJISに変換したいです!
-
ASP.NET SJIS→UTF-8文字コード...
-
C#でのpngからbmpへの変換について
-
10進数をBCDに変換する方法
-
アセンブラ言語の数字を数値に...
-
HRESULTの代替となる型
-
N88BASICのバイナリデータをテ...
-
緯度、経度の 10進法と 60進法...
-
gmtime()とlocaltime()は
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
TCP/IP通信時のサーバーからの受信
-
Windows上で、シグナル(SIGTERM...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
家電製品の電力周波数を変える機械
-
逆コンパイルと逆アセンブルの...
-
エクセルVBAの自動変換機能?
-
10進数をBCDに変換する方法
-
VB6からVB2010への変換について
-
緯度、経度の 10進法と 60進法...
-
分を時間に変換するプログラム
-
C#で漢字→ローマ字を変換
-
なぜ通信には16進数文字列が使...
-
vb.netの型変換について
-
正規表現でルビを小書きに変換...
-
マンセル⇔XYZ,RGB変換式或いは...
-
C#で漢数字をアラビア数字に変...
-
VB6から.NETへアップグレード時...
-
php
-
VB 6 を VS 2012に変換するには?
-
3のつく数字と3の倍数のみを表...
-
C++からCへのソース変換について
-
エクセルのvbaで検索ボタンを作る
-
tex 郵便記号のだしかた
おすすめ情報