2017-02-05 11 views
0

辺のグラディエントを計算し、それをOctaveのベクトルとしてプロットして、既存のイメージに重ねることができます。オクターブの辺に勾配ベクトルフィールドをプロットする

エッジを取得するためにSobel演算子を適用しました。ベクトルはうまくいくようです。しかし、できるだけコードを減らしたいと思います。より少ないステップで同じ結果を達成できます。

私はいくつかのコードをここに明記しました。あなたの助けを前にありがとう。

########################################################################### 
# 
# Get Panda picture 
# 
########################################################################### 
C = imread ("C:\\Users\\Elizabeth Judith\\Desktop\\cesar\\panda.png"); 

########################################################################### 
# 
# Transform Panda picture from Colors to Gray 
# 
########################################################################### 
G = 0.3*C(:,:,1) + 0.6*C(:,:,2) + 0.1*C(:,:,3); 
imwrite(G,"C:\\Users\\Elizabeth Judith\\Desktop\\cesar\\panda_gray.png"); 

########################################################################### 
# 
# Gradient of Sobel 
# 
########################################################################### 
Edge = edge(G,"sobel"); 
[gx,gy] = gradient(double(Edge)); 

indices = find(abs(gx)==0.5); 
indices = indices(1:2:end); # To delete arrows 
gx(indices) = NaN; 

indices = find(abs(gx)==0.5); 
indices = indices(1:2:end); # To delete arrows 
gx(indices) = NaN; 

indices = find(abs(gx)==0.5); 
indices = indices(1:2:end); # To delete arrows 
gx(indices) = NaN; 

indices = find(abs(gy)==0.5); 
indices = indices(1:2:end); # To delete arrows 
gy(indices) = NaN; 

indices = find(abs(gy)==0.5); 
indices = indices(1:2:end); # To delete arrows 
gy(indices) = NaN; 

indices = find(abs(gy)==0.5); 
indices = indices(1:2:end); # To delete arrows 
gy(indices) = NaN; 

########################################################################### 
# 
# plot gradient vectors over image 
# 
########################################################################### 
figure; 
imshow(G, []); 
hold on; 

########################################################################### 
# 
# Quiver of the gradient 
# 
########################################################################### 
h1 = quiver(abs(gx),abs(gy)); 

########################################################################### 
# 
# To scale quiver arrows 
# 
########################################################################### 
set(h1,'AutoScale','on', 'AutoScaleFactor', 15); 

Resultant Image

+0

このコードはあなたのために機能しますか?正しい出力が得られますか?あなたが探しているいくつかの具体的な改善はありますか?速度?なぜそうでない場合は?あなたが他の目標を持っていなければ、同じ仕事をするならば、クリアコードはコンパクトコードよりも優れていることが多いです。スピードを上げるために、コードプロファイラを実行して、ほとんどの時間を費やしてみることができます。 –

+0

また、サンプル画像をリンクして、他人があなたが何を見ているかを確認できるようにすることもできます。 –

+0

コードが機能し、正しい出力が得られます。しかし、私は矢印を削除する方法は私に複雑に見えます。簡単にする方法があるのだろうかと思います。一方、まだ投稿に画像を埋め込むことは許可されていないため、代わりにリンク(結果画像)を含めるようにしました。 –

答えて

0

プロットを矢筒矢の数を削減する別の方法があります: https://www.mathworks.com/matlabcentral/newsreader/view_thread/306387

quiver(gx(1:2:end,1:2:end),gy(1:2:end,1:2:end)) 

問題は、それがの半分を取っているので、それが画像を縮小するということです勾配情報だから、おそらくあなたも背景画像を拡大縮小し、より少ないステップで同様の結果を得ることができます。

最高のご協力ありがとうございます

+0

私は、このソリューションは少ないステップで動作することを確認します。しかし、あなたが言ったように、それは私のベクトル画像を縮小します。それにもかかわらず、私は背景画像も縮小することができ、同様の結果をより少ない解像度で得ることができます。あなたが最終的な解決を気にしないなら、おそらく良いオプションでしょう。 –

関連する問題