2013-05-27 32 views
6

Tôi đang cố chuyển đổi hình ảnh (được biểu diễn dưới dạng ma trận) trong R thành không gian tọa độ cực với điểm gốc là 0,0 (góc trên cùng bên trái). Với 215x215 ma trận x trông giống như:Biến đổi hình ảnh trong R

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) 

Tuy nhiên, xn chỉ trông giống như:

enter image description here

Khi tôi hy vọng điều này:

enter image description here

Bất kỳ ý tưởng nào tôi đang làm sai?

Trả lời

9

Có vấn đề với góc: atan trả về một góc theo radian. nếu bạn tròn nó, không có nhiều thông tin trái ...

Hãy thử với:

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

Transformed image

Nó không phải là hình ảnh mà bạn mong đợi, mà rõ ràng là việc chuyển đổi ngược lại, với trung tâm ở giữa hình ảnh.

# 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

Cảm ơn, câu trả lời tuyệt vời! Có thể bạn có thể giải thích những gì từng phần của mã đang làm? Tôi là một chút nhầm lẫn với công thức bạn đang sử dụng cho r và theta và nhân của các giá trị sin/cos. Cảm ơn một lần nữa – by0

+1

Tôi đã phần nào đơn giản hóa mã và thêm một vài nhận xét. –

Các vấn đề liên quan