• 締切済み

ラドン変換を用いた回転・拡大の算出(プログラミング言語は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); というところまでやりました。

みんなの回答

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

仰っている理論通りなら、 明示的にに対数変換の計算をしないでも、そのまま、C11とC22を比べてx方向とy方向にどれだけシフトさせたときに一番ぴったり合うかを調べて、そのシフト量から、φとλを算出すればいいと思います。 ほんとは対数変換するってことを考えると、どこがぴったり合うか調べるときに、低周波成分を高周波成分よりも重みを高くして適合度を調べるとかしたほうがいいかな。

kani1123
質問者

お礼

書き込みありがとうございます! 実は上に書いた理論だけがすべてじゃなくて続きがあります。  確かに上の理論だけ見るとシフト量から求められそうですが、(説明不足で申し訳ないです)それだけじゃダメみたいで、の後に、位相限定相関法という手法を用いてシフト量を計算するらしいですが、その前段階でつまづいてしまっている状況です。   上のプログラムからどうやったらできるか教えていただけるとうれしいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • matlabを使ったアフィン変換

    matlabを使ったアフィン変換を考えています。三次元座標(x,y,z)=(100,30,35), (X,Y,Z)=(105,28,34)が分かっていて(x,y,z)から(X,Y,Z)への回転(α、β、γ)および移動(dx,dy,dz)を求めたいのですがどのようにプログラミングを行えばよいのでしょうか?よろしくお願いします。

  • 形変換 アフィン変換 

    形変換 アフィン変換  前回同様の内容で質問させて頂きました。 不明な点がいくつかありますので改めて質問させて頂きます。 前回の質問内容:http://okwave.jp/qa/q5957715.html アフィン変換 ⊃ 線型変換 であるとご回答頂いたのですが、これはアフィン変換は 線形変換を含むという認識で良いでしょうか? 線形変換はアフィン変換の部分集合だと理解したのですが間違いでしょうか? また、線形変換及びアフィン変換の定義に関して ・線型変換の定義: [1]  体 K 上のベクトル空間 V 上の変換 f で、  x,y∈V, a,b∈K, について常に f(ax+by) = a f(x) + b f(y) が成り立つもの。 ・アフィン変換の定義: [2]  体 K 上のベクトル空間 V 上の変換 f で、  x,y∈V, a,b∈K, について a+b = 1 のときは f(ax + by) = a f(x) + b f(y)  が成り立つもの。 とご教示頂きました。 定義[1],[2]について考えると、 [1]が成り立てば、[2]は成り立つと思います。 [1]はa+b=1によらず、f(ax+by)=af(x)+bf(y)が成り立ちますから。 翻って、[1]ならば[2]が成り立つと言うことは線形変換がアフィン変換を含むと 言う事になりませんか?この点で混乱しています・・・ ご回答よろしくお願い致します。

  • 直交変換と回転は同じものなの?

    座標の回転が直交変換なのは任意の回転がx軸の回転とy軸の回転とz軸の回転の組み合わせであることから理解できます しかしその逆が分からないのです つまり直交変換は座標の回転なのかどうかです 3次元直交座標Aと3次元直交座標Bがある 空間に点Pがある PのAによる座標を(x,y,z)=a^Tとし PのBによる座標を(X,Y,Z)=b^Tとする そこで質問します 「U^T・U=Eかつ|U|=1である3次正方実行列Uがあり任意のPについてa=U・bならばBはAを原点を中心に回転したものである」 は正しいのですか? 正しければどうしてなのですか? 正しくなければどうしてなのですか? よろしくお願いします

  • プログラミング(c言語)

    以下のプログラムでオイラー法を用いた2階微分方程式を解きたいのですが、xとvyの値が変化しません。どこが間違っているのか教えて欲しいです 写真は問題文です #define _USE_MATH_DEFINES #include<stdio.h> #include<math.h> int main(){ int i; double x,x0,y,y0,vx,vx0,vy,vy0,r,dt,t=0.0; double G=6.674/pow(10.0,11.0),M=1.988*pow(10.0,30.0); x0=1.496*pow(10.0,11.0),y0=0.0,vx0=0.0,vy0=2.978*pow(10.0,4.0); dt=M_PI/100; for(i=1;i<=2000;i++){ x=x0+dt*vx0; y=y0+dt*vy0; r=sqrt(x0*x0+y0*y0); vx=vx0-dt*(G*M*x0/(r*r*r));vy=vy0-dt*(G*M*y0/(r*r*r)); t=dt*i; printf("x(%f)=%e y(%f)=%e vx(%f)=%e vy(%f)=%e\n",t,x,t,y,t,vx,t,vy); x0=x; y0=y; vx0=vx; vy0=vy; } return(0); }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • 3次元での回転による座標変換

    3次元での回転による座標変換に関して質問があります. X軸,Y軸,Z軸の直交座標系があるとします. この座標系において,ある位置ベクトル(a1,b1,c1)がX軸,Y軸,Z軸と成す角度は,θx,θy,θzは,ベクトルの内積から算出可能だと思います. θx=a1/sqrt(a1^2+b1^2+c1^2) θy=b1/sqrt(a1^2+b1^2+c1^2) θz=c1/sqrt(a1^2+b1^2+c1^2) X,Y,Zの直交座標系を回転させて,この位置ベクトルの向きを基準としたX'軸,Y'軸,Z'軸による新しい直交座標系を設定するには,どのようにすればよいでしょうか? θx,θy,θzと各軸での回転角度は違うものという認識でいいのでしょうか? 元の座標系において,各軸回りに順番に回転させればいいかと思うのですが,どうもイメージがつかみきれません. よろしくお願い致します.

  • 円のハフ変換をC言語で

    r^2=(x-a)^2+(y-b)^2 を変形して b=√(r^2-(x-a)^2)+y にしました。課題ではr=10と指定されていて、 b=√(100-(x-a)^2)+y となります。これをa,b平面にプロットすればいいのですが、 画像平面のxとyというのがいまさら分かりません。 画素値をどう入力すればいいのでしょうか。 例えば1行1列目の画素値をwとしたとき、 x[1]=w、y[1]=w とすればいいのでしょうか。 ご回答お願いします。

  • カメラ画像のアフィン変換について

    カメラの特性と画像処理にお詳しい方にお伺いします。 カメラを使ってある風景Aを撮影して、そのカメラ位置を保持しながら後ろへ数m下がって、同じ風景Bを撮影します。2枚の画像A,Bを比べると、視差がある為、画像中心から外へ広がるほど相対的な歪が大きくなっていきます。この時、画像Aにアフィン変換Fによる画像処理を施して歪を無くし、画像Bを拡大したものがほぼぴったり画像Aになるようにしたいのです。(u,v)=F(x,y)の関数F、若しくはその導出の仕方を教えてください。よろしくお願いします。

  • 有界変動についての真偽判定問題で教えて下さい

    下記の問題を解いています。 [問] f:[a,b]→R (a,b∈R,a<b)とする時,次の真偽を判定せよ。 (1) fが増加ならばfは有限変動である。 (2) fが増加ならf(x)=∫[x..a]f'(y)dy. (3) fが有界変動ならばfは2つの増加関数の差として表される。 (4) fが絶対連続ならばf(x)=∫[x..a]f'(y)dy. (5) fが有界変動ならばfはa.e.で微分可能 有界変動の定義は 『f:[a,b]→R (但し,a,b∈R,a<b)とする。 V((s,t],f)は(s,t]⊂[a,b]でのfの変動 ⇔ V((s,t],f)=sup{Σ[1≦k≦n]|f(s_k)-f(s_(k-1))|∈R∪{∞};n∈N} (但し,s_0,s_1,…,s_nはs=s_0<s_1<…<s_n=tなる分割) そして,特にV((s,t],f)<∞の時,fは(s,t]で有界変動という。 V((a,b],f)<∞の時,単にfは有界変動であるという』 絶対連続の定義は 『f:[a,b]→R (但し,a,b∈R,a<b)とする。fが[a,b]で絶対連続 ⇔ 0<∀ε∈R,0<∃δ∈R; i≠jならばInt[a_i,b_i]∩Int[a_j,b_j]=φ(但し,Int[a_i,b_i]は[a_i,b_i]の内核を表す)でΣ(b_i-a_i)<δなる[a,b]の任意の部分区間の列{[a_i,b_i]} に対し Σ(f(b_i)-f(a_i))<ε』 です。 (1)については fが閉区間で単調なのでfは有界。従って,fは有界変動 (2)についてはf(x)=∫[x..a]f'(y)dyとはdf(x)/dx=f'(x)を満たす関数という事なのでそのような関数としてf(x)=∫[x..a]f'(y)dy+1とかも採れる。よってf(x)=∫[x..a]f'(y)dyとは限らないので偽。 (3)についてはJordanの分解定理「f:[a,b]→Rが有界変動. ⇔ ∃f_1とf_2とは増加関数でf=f1-f2」 より真。 (4)についても(2)と同様でf(x)=∫[x..a]f'(y)dy+1とかも採れる(∵f(x)=∫[x..a]f'(y)dy+1はf(x)=∫[x..a]f'(y)dyを平行移動しただけなので絶対連続性は保たれる)。よって偽。 (5)については測度としてルベーグ測度λが仮定してあるんだと思います。 fとしてディレクレ関数 f(x)=1 (xが有理数の時),0 (xが無理数の時) を考えるとλ([a,b]∩Q)=0,λ([a,b]∩(R\Q))≠0ですがfは[a,b]の至る所で不連続なので[a,b]の至る所で微分不可能なので 勿論,a.e.(即ち[a,b]∩(R\Q))ででも微分不可能。 よって偽。 と結論づいたのですが如何でしょうか?

  • 回転と変換の合成(三次元)

    1. x=3,y=4 を通り、z 軸に 平行な軸A の回りにθ回転さ      r00  r01  r02  tx                           r10  r11  r12  ty せる変換の行列を書きなさい。 r20 r21 r22 tz                        0 0 0 1 (同次座標形式で) 2. θ=90°の時、変換行列を示しなさい(数値で)。 3. 点(8,3,20)は上記(問題2)の回転操作でどこに 移るか。

印刷ができない
このQ&Aのポイント
  • プリンタの設定がA3写真になっているため、A4普通紙に印刷できない問題が発生しています。
  • パソコンからの印刷では、A3やインクジェット紙になってしまい、正常に印刷できません。
  • 製品名はMFC-J6983CDWで、Windows11で有線LANに接続されています。ひかり回線を使用しています。
回答を見る

専門家に質問してみよう