在R中查找二进制图像的主轴/图像方向

时间:2013-04-17 04:32:49

标签: image r matlab image-processing binary-data

我有一个高分辨率的二进制图像,看起来像:

enter image description here

我正在尝试计算应该稍微向右旋转的主轴,并最终获得对象的方向轴

帖子here(在matlab中)建议一种方法是计算数据点的协方差矩阵并找到它们的特征值/特征向量

我正在尝试在R

中实现类似的东西
%% MATLAB CODE Calculate axis and draw

[M N] = size(Ibw);
[X Y] = meshgrid(1:N,1:M);

%Mass and mass center
m = sum(sum(Ibw));
x0 = sum(sum(Ibw.*X))/m;
y0 = sum(sum(Ibw.*Y))/m;

#R code

d = dim(im)
M = d[1]
N = d[2]

t = meshgrid(M,N)
X = t[[2]]
Y = t[[1]]
m = sum(im);
x0 = sum(im %*% X)/m;
y0 = sum(im %*% Y)/m;

meshgrid <-function(r,c){
  return(list(R=matrix(rep(1:r, r), r, byrow=T), 
          C=matrix(rep(1:c, c), c)))
}

但是,计算mx0y0在R中耗时太长。

有人知道R中的实现吗?

2 个答案:

答案 0 :(得分:2)

使用var直接计算方差矩阵需要1/3秒。

# Sample data
M <- 2736
N <- 3648
im <- matrix( FALSE, M, N );
y <- as.vector(row(im))
x <- as.vector(col(im))
im[ abs( y - M/2 ) < M/3 & abs( x - N/2 ) < N/3 ] <- TRUE
#image(im)
theta <- runif(1, -pi/12, pi/12)
xy <- cbind(x+1-N/2,y+1-M/2) %*% matrix(c( cos(theta), sin(theta), -sin(theta), cos(theta) ), 2, 2)
#plot(xy[,1]+N/2-1, xy[,2]+M/2-1); abline(h=c(1,M),v=c(1,N))
f <- function(u, lower, upper) pmax(lower,pmin(round(u),upper))
im[] <- im[cbind( f(xy[,2] + M/2 - 1,1,M), f(xy[,1] + N/2 - 1,1,N) )]
image(1:N, 1:M, t(im), asp=1)

# Variance matrix of the points in the rectangle
i <- which(im)
V <- var(cbind( col(im)[i], row(im)[i] ))
# Their eigenvectors
u <- eigen(V)$vectors
abline( M/2-N/2*u[2,1]/u[1,1], u[2,1]/u[1,1], lwd=5 )
abline( M/2-N/2*u[2,2]/u[1,2], u[2,2]/u[1,2] )

Binary image, with major and minor axes

答案 1 :(得分:1)

尝试使用this link中合适的Rblas.dll替换默认的Rblas.dll。