问候Overflowers,
我在MatLab中有一个灰色图像矩阵,并且该图像的特定像素坐标很少。 我想计算该矩阵中矩形区域内的值的平均值和标准差,以便:
现在,如果我可以为垂直,水平和两个对角线情况做这件事,我会很高兴,但我真的很感激,如果我可以在任何角度做到这一点。
有什么想法吗?
答案 0 :(得分:3)
因此,给定输入角度theta
和一堆坐标points
,您希望该角度处的最小包围矩形(这意味着什么? - 高度轴设置为该角度?宽度轴?从垂直 - 顺时针(如标题)或水平 - 逆时针(如数学)?)的角度。
此外,我们调整高度,使其> =宽度。
在这种情况下,我认为以下内容可能有效:
theta
旋转的x-y轴(使用旋转矩阵)theta
因为我们已经转换了坐标)theta
向后旋转)。这样的事情可以起作用(未经测试),调整你的愿望:
% pts is 2xn
% theta is in degrees, anticlockwise from horizontal.
% returns 2xn matrix of indices into the min enclosing rectangle.
function minClosingRect = calcMinEnclosingRect( pts, theta )
% convert to radians and rotate by theta degrees ANTICLOCKWISE
thRad = theta*pi/180;
rotMat = [ cos(thRad) -sin(thRad); sin(thRad) cos(thRad) ];
ptsRot = rotMat * pts;
% find minimum enclosing rectangle of ptsRot
% in the horizontal-vertical direction
% this is just min/max coords.
minX = min(ptsRot(1,:));
maxX = min(ptsRot(1,:));
minY = min(ptsRot(2,:));
maxY = max(ptsRot(2,:));
% make sure height >= width
if (maxY-minY)<(maxX-minX)
% NOTE: depending on how you want you can extend
% - out the bottom
% - the top
% - centred (etc)
% e.g. to make the rectangle taller out the bottom
minY = maxY - (maxX-minX);
end
% construct indices into rectangle
[X Y] = meshgrid( minX:maxX, minY:maxY )
% convert indices back by rotating thRad degrees backwards.
rotMatInv = [ cos(-thRad) -sin(-thRad); sin(-thRad) cos(-thRad) ];
minClosingRect = rotMatInv * [X(:) Y(:)]';
然后像这样使用它(一个警告是X / Y vs i / j):
minClosingRect = calcMinEnclosingRect( pts, theta );
mean2( Img(minClosingRect) )
std2( Img(minClosingRect) )