入力角度がtheta
で、座標がpoints
の場合、その角度には最小の囲み矩形が必要です(これは何を意味しますか?高さ軸はその角度で設定されます。 (見出しのように)または水平に反時計回りに(数学のように)? さらに、幅が>幅になるように高さを調整します。その場合
、Iは、以下がうまくいくかもしれないと思う:
- は
- (このための回転行列を使用して)角度
theta
によって回転だけXY軸である新しい座標系に座標変換しますこの座標系で最小の囲み矩形を見つけます:これは、水平 - 垂直の次元で最小の囲み矩形を見つけるだけです(既に座標が変換されているため、theta
をもう心配する必要はありません)
- 最小の囲み矩形h高さ> =幅として
- 矩形を元の座標系に戻します(
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(:)]';
次に、この(1つの警告は、I/J対X/Yである)のようにそれを使用します。
minClosingRect = calcMinEnclosingRect(pts, theta);
mean2(Img(minClosingRect))
std2( Img(minClosingRect))
ああ、お詫び申し上げます、私はstddev/meanを計算したいと思います。更新された答え:P –