Image 在R中查找二值图像的长轴/图像方向

Image 在R中查找二值图像的长轴/图像方向,image,r,matlab,image-processing,binary-data,Image,R,Matlab,Image Processing,Binary Data,我有一个高分辨率的二进制图像,看起来像: 我试图计算长轴,它应该稍微向右旋转,最终得到物体的方向轴 一篇帖子(在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 = su

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

我试图计算长轴,它应该稍微向右旋转,最终得到物体的方向轴

一篇帖子(在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代码
d=变暗(im)
M=d[1]
N=d[2]
t=网格网格(M,N)
X=t[[2]]
Y=t[[1]]
m=总和(im);
x0=总和(im%*%X)/m;
y0=总和(im%*%Y)/m;

meshgrid尝试将默认的Rblas.dll替换为来自的合适的Rblas.dll。

使用
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] )
#示例数据

你能用
system.time()
找出哪一行花费的时间更多吗?这是矩阵乘法。我的图像是
2736x3648
哪个操作系统?Mac OSX x64 mountain Lion如果您的图像是由直边组成的,您也可以使用来检测它们。清除。简洁的。快速的非常感谢。
# 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] )