2012-05-02 42 views
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に画像のグラデーションを埋め込みたいのです。

my result

image that i am getting error with

+0

である

Gradient vectors of a circle in an image

あなたがlittlecircle.pngを投稿することができますか? –

答えて

13

あなたは(それ以外の、それが正常に動作します)コードでミスを犯してきました。あなたは以下のように置き換える必要があります。

u = dx; 
v = dy; 

ない

u = x; 
v = y; 

それは魅力のようにthis画像で動作します!

EDIT:あなたがしたい場合は、画像上のベクトルを超課す 、その後、次の操作を行います。それは正しくで表示されませんので、私は、イムは倍増する変換できません

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が必要)。画像の大きさによっては、グラデーションベクトルを表示するためにズームインしたい場合があります。

あなたは下に、画像に重ねベクトルの領域にズーム見ることができます。より良い品質の画像がhttp://i.stack.imgur.com/fQbwI.jpg

+0

お返事ありがとうございます。しかし、私は十分に問題を完全に説明していないと思います。私のコードで生成された勾配ベクトルとあなたのコードは、画像内の円によって引き起こされる勾配ベクトルではありません。作成されたグラジエントフィールドは、外側を指し、サークルの法線を指している必要があります。あなたは単に私がu = xを持つことを望んでいるのではなく、むしろu = x方向の画像領域の勾配を見ています。このコードを実行すると – brucezepplin

+0

すべてクリア; im = imread( 'littlecircle.png'); im = im(:、:、1); im = double(im); [nr、nc] = size(im); [dx、dy] = gradient(im); 震え(dx、dy); あなたが好きな画像には、私が何をしているかがわかります(震えのプロットがどのように見えるかを見てください)。ここで私はスカラー場の四角形を単純に戻しています。私はしかし、実際のベクトルフィールドを返して、私のプログラムで後でベクトルフィールドを使用したいと思います。 – brucezepplin

+0

あなたは何をしたいのか分かりません。コードでは、円から外向きにベクトルを描いています(私はスクリーンショットを拡大して添付しました)。もちろん、あなたは離散空間(画像)のgradを計算する計算ルーチンを持っているので、ベクトルは量子化のために円に絶対に垂直ではありません。すなわち、完全なgradベクトルを解析的に計算するかのように与えられた数学的円。 – Jorge

関連する問題