web-dev-qa-db-ja.com

画像の勾配ベクトル場を計算する

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

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に埋め込みます。これを行うにはどうすればよいですか。

my result

image that i am getting error with

16
brucezepplin

コードに誤りがあります(それ以外は問題なく動作します)。次のものを置き換える必要があります。

u = dx;
v = dy;

ない

u = x;
v = y;

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

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

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に変換しないことに注意してください。画像のサイズによっては、グラデーションベクトルを表示するためにズームインすることをお勧めします。

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

Gradient vectors of a circle in an image

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

14
Jorge