2

タスクを実行しようとしていますが、2 つの問題があります。1 つ目は、画像を撮影して、表面のエッジを検出する必要があります。

これは元の画像です:

元の画像

これが結果になります。

結果

しかし、私はこれを得ました:

実結果

私は非常に単純なコードを使用しています:

filter=[1 2 1;0 0 0;-1 -2 -1];
image=imread('boat.jpg');
image_edge=filter2(filter,image);
imshow(image_edge);

ご覧のとおり、非常に簡単ですが、同じイメージはありません。私のフィルターは間違っていますか?

2 番目の問題は次のとおりです。混合係数の行列 を作成する方法がわかりませんmask(x,y)。この行列は、エッジに基づいて作成する必要があります (平坦な領域では値 1 で、エッジに向かって徐々に 0 に減少します)。どのコマンドを使用すればよいですか?

4

2 に答える 2

3

フィルターは垂直方向と水平方向の両方のエッジを抽出していますか? filter2 は cov2 関数を使用し、垂直エッジと水平エッジの両方を抽出するため、コードで cov2 を 2 回使用する必要があります。垂直および水平エッジのconv2の例については、このページを確認してください。

MATLAB でedgeコマンドを試すこともできますが、強度イメージで機能します。

I = imread('boat.jpg');
BW1 = edge(I,'prewitt');  % or any other filters supported
imshow(BW1);

さまざまな種類のエッジ フィルターについては、このページを確認してください。

于 2013-12-26T20:55:05.377 に答える
2

NKNは間違いなく要点を得ました。私が指摘したい唯一のことは、y方向にsobelカーネルを使用していることです。x軸でエッジ検出を効果的に実行したい場合、カーネルは

Sobel_x = [1 0 -1; 2 0 -2; 1 0 -1];

また、キャニーなど、他にも多くの優れた検出器があることに注意してください。ぜひご覧になることを強くお勧めします。


2 番目の質問については、何を求めているのかわかりませんが、正規化された勾配マグニチュード マトリックスが必要なようです。それを取得するには、最初に (驚き!) 勾配行列を計算する必要があります。

G=sqrt(G_x.^2 + G_y.^2);

G_x と G_y は、あなたの場合、画像を Sobel_x と Sobel_y で畳み込んで取得されています。このマトリックスには、エッジを検出している画像の各ピクセルの勾配の大きさが含まれます。

次に、間隔 [0,1] 内のものを取得するには、行列を正規化します。

G = G/max(G(:));

この場合、希望とは反対の結果が得られるため (1 に近いほど、ピクセルがエッジの一部である可能性が高いことを意味します)、単純に G = 1-G を実行できます。


編集:

また、見栄えの良いバイナリ結果を得るには、勾配マグニチュード マトリックスのしきい値を設定する必要があることに注意してください。

たとえば、1-G を実行する前に、G で 0.15 のしきい値を試しました。

G = G>0.15;
G = 1-G
imshow(G)

sobel の結果は次のとおりです。

ここに画像の説明を入力

これは、結果を表示するためのほぼランダムなしきい値にすぎません。

しきい値が高いほど、エッジとして分類する特徴が細かくなります。

于 2013-12-26T21:13:42.283 に答える