16

画像(円の画像)を読み取り、その画像の勾配ベクトル場(つまり、円に均一に垂直に向いているベクトル)を計算したいと思います。私の論理は私を少し失敗させていますが、私は持っています:

clear all;
im = im2double(imread('littlecircle.png'));
im = double(im);
[nr,nc]=size(im);
[dx,dy] = gradient(im);
[x y] = meshgrid(1:nc,1:nr);
u = x;
v = y;
quiver(x,y,u,v)

上記を単純に行うと、ベクトル場が得られますが、これは単に空のメッシュの勾配です(つまり、勾配y = xのベクトル場だけです)。私が実際に欲しいのは使用することです

[dx,dy] = gradient(im);

画像内の円のエッジを検出し、画像内の円による勾配ベクトル場を計算します。明らかに、u=xとv=yを割り当てると、直線のベクトル場しか得られません。したがって、基本的に、画像の勾配をベクトルuとvに埋め込みます。これを行うにはどうすればよいですか。

私の結果

エラーが発生している画像

4

1 に答える 1

14

コードに誤りがあります(それ以外は正常に機能します)。次のものを置き換える必要があります。

u = dx;
v = dy;

いいえ

u = x;
v = y;

この画像でチャームのように動作します!

編集:画像にベクトルを重ね合わせたい場合は、次のようにします。

clear all;
im = imread('littlecircle.png');
[nr,nc]=size(im);
[dx,dy] = gradient(double(im));
[x y] = meshgrid(1:nc,1:nr);
u = dx;
v = dy;
imshow(im);
hold on
quiver(x,y,u,v)

imshowでは正しく表示されないため(uint8が必要)、imをdoubleに変換しないことに注意してください。画像のサイズによっては、グラデーションベクトルを表示するためにズームインすることをお勧めします。

以下の画像に重ねられたベクトルの拡大された領域を見ることができます:

画像内の円の勾配ベクトル

より良い品質の画像はhttp://i.stack.imgur.com/fQbwI.jpgにあります

于 2012-05-02T18:20:03.047 に答える