0

理由を説明すると、これはもっと理にかなっているかもしれません

エッジ検出(1 =エッジ、0 =エッジなし)を実行した測定スタッフの写真の論理行列(103x3488)出力があります。スタッフの目盛り間の距離をピクセル単位で計算することを目的としています。問題、スタッフが途中でたるんでいます。

アイデア:ユーザーがスタッフの両端とサグの中点の座標(ginputなどを使用)を入力すると、これらのポイント間のエッジを配列に抽出できれば、エッジの位置を簡単に見つけることができます。

この方法で行列から配列を抽出する方法はありますか?

他のアイデアにもオープンで、matlabを1か月しか使用していないため、ほとんどの機能は私にはわかりません。

編集:画像へのリンク

マトリックスの小さな領域を示しているので、この例では1と2がサンプリングしたいポイントであり、赤い線に沿って発生するポイントを返したいと思います。

乾杯

4

2 に答える 2

0

これを試して

dat=imread('83zlP.png');

figure(1)
pcolor(double(dat))
shading flat
axis equal

% get the line ends
gi=floor(ginput(2))
x=gi(:,1);
y=gi(:,2);

xl=min(x):max(x); % line pixel x coords
yl=floor(interp1(x,y,xl)); % line pixel y coords


pdat=nan(length(xl),1);
for i=1:length(xl)
    pdat(i)=dat(yl(i),xl(i));
end

figure(2)
plot(1:length(xl),pdat)

peaks=find(pdat>40); % threshhold for peak detection
bigpeak=peaks(diff(peaks)>10); % threshold for selecting only edge of peak

hold all
plot(xl(bigpeak),pdat(bigpeak),'x')
meanspacex=mean(diff(xl(bigpeak)));
meanspacey=mean(diff(yl(bigpeak)));
meanspace=sqrt(meanspacex^2+meanspacey^2);

マトリックスpdatは、選択した線に沿ったピクセルを示します。meanspaceはピクセル単位のエッジ間隔です。画像によっては、しきい値をいじる必要がある場合があります。

于 2011-03-17T18:11:58.143 に答える
0

画像を見た後、あなたが言及している「たるみ」がどこで起こっているのかわかりません。画像は回転しますが、を使用して修正できますimrotate。回転させる必要のある度合いは、十分に簡単である必要があります。座標Aを入力しB、逆正接を使用して、0度からの角度オフセットを見つけます。

ポイントに関しては、まっすぐに配置されたら、画像マトリックスに行を指定し(1 x 3448ベクトルになります)、を使用findしてゼロ以外のベクトルインデックスを取得するだけです。回転関数がピクセルをいくらか補間している可能性があるため、「線」ごとに複数のインデックスを取得する場合がありますが、それらは連続した数値として識別でき、それらを平均して概算値を取得できます。

于 2011-03-17T19:20:39.970 に答える