2013-05-27 19 views
6

R'deki bir görüntüyü (matris olarak temsil edilen), 0,0 (sol üst köşe) olacak şekilde kutupsal koordinat alanına dönüştürmeye çalışıyorum.Polar-dönüş görüntüsündeki R

enter image description here

0: Bunu bekliyoruz zaman

enter image description here

: gibi

enter image description here

 
x0 = as.vector(col(x)) 
y0 = as.vector(row(x)) 

r = sqrt((x0^2) + (y0^2) )#x 
a = atan(y0/x0)#y 
m = as.matrix(data.frame(y=a, x=r)) 

m = round(m) 
m[m>215] = NA 
m[m==0] = NA 

xn = x[m] 
xn = matrix(xn, 215, 215) 

Ancak, xn sadece görünür: benziyor 215x215 matrisi x Verilen

Neyi yanlış yaptığım hakkında bir fikrin var mı?

cevap

9

Açıyla ilgili bir sorun var: atan radyan cinsinden bir açı döndürüyor. , O

a = atan(y0/x0) * 215/(pi/2) 

Transformed image

değil anlaşılan ters dönüşümdür beklediğiniz görüntüyü, : Eğer o yuvarlak eğer ile deneyin ...

sol çok bilgi yok Görüntünün ortasındaki merkezle.

# Load the image 
library(png) 
library(RCurl) 
d <- readPNG(getBinaryURL("http://i.stack.imgur.com/rMR3C.png")) 
image(d, col=gray(0:255/255)) 

# Origin for the polar coordinates 
x0 <- ncol(d)/2 
y0 <- nrow(d)/2 

# The value of pixel (i,j) in the final image  
# comes from the pixel, in the original image,  
# with polar coordinates (r[i],theta[i]). 
# We need a grid for the values of r and theta. 
r <- 1:ceiling(sqrt(max(x0,nrow(d))^2 + max(y0,ncol(d))^2)) 
theta <- -pi/2 + seq(0,2*pi, length = 200) 
r_theta <- expand.grid(r=r, theta=theta) 

# Convert those polar coordinates to cartesian coordinates: 
x <- with(r_theta, x0 + r * cos(theta)) 
y <- with(r_theta, y0 + r * sin(theta)) 
# Truncate them 
x <- pmin(pmax(x, 1), ncol(d)) 
y <- pmin(pmax(y, 1), nrow(d)) 

# Build an empty matrix with the desired size and populate it 
r <- matrix(NA, nrow=length(r), ncol=length(theta)) 
r[] <- d[cbind(x,y)] 
image(r, col=gray(0:255/255)) 
+0

Teşekkürler, harika cevap! Kodun her bir bölümünün ne yaptığını açıklayabilir misiniz? R ve theta için kullandığınız formül ve sin/cos değerlerinin çarpımı hakkında biraz kafam karıştı. Tekrar teşekkürler – by0

+1

Kodu biraz basitleştirdim ve birkaç yorum ekledim. –