2

スクエア BW (uint8)

オクターブで次のコードを画像に適用しようとしました:

sq = imread("Square BW.jpg"); 
figure(1), imshow(Square);

cont1 = edge(sq,"Sobel");
figure(2), imshow(cont1);

私が得るイメージは次のとおりです。

エッジ (論理)

Prewitt 関数を使用すると、同様の画像が表示されます。誰が私に何が起こっているのか説明できますか? 問題は、プロセスを結果だけで視覚化できないため、コードが機能しない理由が理解できないことです。

4

2 に答える 2

2

問題は、Octave でのしきい値の計算方法にあるようです。type edgeOctave プロンプトまたはオンラインで入力してソースを調べることで、Octave がどのようにそれを行うかを確認できます(コードは GPL であるため、正確なコードはコピーしていませんが、非常に単純です)。

境界線を取得するには、しきい値を自分で設定する必要があります (Octave の画像パッケージの将来のバージョンでこれが修正されることを願っていますが、デフォルトに関する Matlab のドキュメントが不明確であるため、現時点では Matlab と互換性がありません)。

于 2015-03-24T22:10:37.937 に答える
1

しきい値の計算方法に間違いなく問題がありますが、この図で使用する正しい値を見つけることができませんでした。何度も試みた後、完全に機能しているように見える次のコードを見つけました。

sq = imread("Square BW.jpg"); 
maskSobel = fspecial("sobel");
mSobel = uint8(zeros(size(BW)));
for i = 0:3
  mSobel += imfilter(sq, rot90(maskSobel, i));
end
figure(1), imshow(mSobel);

最初に、ソーベル行列/演算子と、画像の正方 BW と同じサイズのゼロ行列を作成します。次に、すべての方向 (左右、上下、左右、上下) で画像をフィルター処理するために、ソーベル行列を 4 回 (90 度) 回転させ、常に結果を mSobel 行列に追加します。作成した。最終結果は次のとおりです。

結果

于 2015-04-15T01:05:24.617 に答える