2016-12-11 40 views
1

簡単に言えば、球面上で使用する画像をマップする必要があります。私は数時間これをやろうとしています。 Googleで検索私は適切な解決策を見つけられません(ダムの人に説明されています)。球面上の画像のマッピング

私はこのリンクのコードは https://www.codeproject.com/articles/19712/mapping-images-on-spherical-surfaces-using-cと思っています。しかし(私はすべてが大丈夫だと思う)ジュリアで動作させることができます。

これは、これまでの私のコードです:

image = brightNoise(height,width,seed,rand=true) 

arr = Array{Float64}(height,width) 

function MapCoordinate(i1, i2,w1,w2,p) 
    return ((p - i1)/(i2 - i1)) * (w2 - w1) + w1 
end 

function Rotate(angle, axisA, axisB) 
    return axisA * cos(angle) - axisB * sin(angle),axisA * sin(angle) + axisB * cos(angle) 
end 

phi0 = 0.0 
phi1 = pi 
theta0 = 0.0 
theta1 = 2.0*pi 
radius = 50 


arr = Array{Float64}(height,width) 

for i= 1:size(image)[1] 
    for j= 1:size(image)[2] 
     #map the angles from image coordinates 
     theta = MapCoordinate(0.0,width - 1,theta1, theta0, i) 
     phi = MapCoordinate(0.0,height - 1,phi0,phi1, j) 
     #find the cartesian coordinates 
     x = radius * sin(phi) * cos(theta); 
     y = radius * sin(phi) * sin(theta); 
     z = radius * cos(phi); 
     #apply rotation around X and Y axis to reposition the sphere 
     y,z=Rotate(1.5, y, z); 
     x,z=Rotate(pi/2, x, z); 
     #plot only positive points 
     if (z > 0) 
      color = image[i,j] 
      ix = floor(Int64,x) 
      iy = floor(Int64,y) 
      arr[ix,iy] = color 
      println(ix,iy) 
     end 
    end 
end 

imageがちょうどジュリアに発生した黒と白のノイズであるが、私はそれで球をラップする必要があります。

+0

これは、スタックオーバーフローよりもコードレビューに適しているようです。 –

答えて

2

mandrill

は、私はあなたのコードがやっていることはほとんど考えを持っていますが、インデックスの問題の一部を修正することは、あなたが始めるのに役立つかもしれない何かを提供します。とにかく球形をしているようです。

using Images, FileIO 
mandrill = load(mandrill.png")  
height, width = size(mandrill) 
arr = colorim(Array{Float64}(height, width, 3)) 

function MapCoordinate(i1, i2, w1, w2, p) 
    return ((p - i1)/(i2 - i1)) * (w2 - w1) + w1 
end 

function Rotate(angle, axisA, axisB) 
    return axisA * cos(angle) - axisB * sin(angle),axisA * sin(angle) + axisB * cos(angle) 
end 

phi0 = 0.0 
phi1 = pi 
theta0 = 0.0 
theta1 = 2.0 * pi 
radius = 200 

for i = 1:size(mandrill, 1) 
    for j = 1:size(mandrill, 2) 
     # map the angles from image coordinates 
     theta = MapCoordinate(1.0, width - 1, theta1, theta0, i) 
     phi = MapCoordinate(1.0, height - 1, phi0, phi1, j) 
     # find the cartesian coordinates 
     x = radius * sin(phi) * cos(theta) 
     y = radius * sin(phi) * sin(theta) 
     z = radius * cos(phi) 
     # apply rotation around X and Y axis to reposition the sphere 
     y, z = Rotate(1.5, y, z) 
     x, z = Rotate(pi/2, x, z) 

     # plot only positive points 
     if z > 0 
      color = mandrill[i, j] 
      ix = convert(Int, floor(x + width/2)) 
      iy = convert(Int, floor(y + height/2)) 
      arr[ix, iy, :] = [color.r, color.g, color.b] 
     end 
    end 
end 

save("/tmp/mandrill-output.png", arr) 
run(`open /tmp/mandrill-output.png`) 
+0

正常に動作します。 (私は、少なくとも実行することを意味します)ありがとう。しかし、別の画像で試してみると2000x1000の画像のインデックス1001にアクセスしようとすると「BoundsError」というエラーが出ます。何かご意見は?再度、感謝します! – exsnake

+0

@exsnakeインデックスを正しく計算する必要があります。そうでなければ、配列にアクセスするときに範囲外に出ます。私はあなたがどのようにインデックスを計算しているのか分かりません。あなたは実験中に 'clamp'を使うことができます... – daycaster

+0

私は、画像が正方形の画像でなければならないことを認識しています。もっとうまくいくと分かっていますが、途中で奇妙な成果物が得られます...私はコードに触れ続けます。助けてくれてありがとう! – exsnake

関連する問題