Изображение с полярным преобразованием в R

Я пытаюсь преобразовать изображение (представленное в виде матрицы) в R в полярное координатное пространство с началом координат 0,0 (верхний левый угол). Учитывая матрицу 215x215 x, которая выглядит так:

введите здесь описание изображения

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)

Однако xn выглядит так:

введите здесь описание изображения

Когда я ожидаю этого:

введите здесь описание изображения

Любая идея, что я делаю неправильно?


person Omar Wagih    schedule 27.05.2013    source источник


Ответы (1)


Есть проблема с углом: atan возвращает угол в радианах. если его округлить, то мало информации останется...

Попробуйте с:

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

Преобразованное изображение

Это не то изображение, которое вы ожидаете, которое, по-видимому, является обратным преобразованием с центром в середине изображения.

# 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))
person Vincent Zoonekynd    schedule 27.05.2013
comment
Спасибо, отличный ответ! Не могли бы вы объяснить, что делает каждая часть кода? Я немного запутался в формуле, которую вы используете для r и тета, а также умножения значений sin/cos. Спасибо еще раз - person Omar Wagih; 29.05.2013
comment
Я несколько упростил код и добавил несколько комментариев. - person Vincent Zoonekynd; 29.05.2013