2012-05-02 17 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) 

अगर मैं थे बस है ऊपर, मैं एक सदिश क्षेत्र पाने के लिए है, लेकिन यह सिर्फ एक खाली जाल की ढाल है (यानी सिर्फ एक सदिश क्षेत्र ढाल वाई = एक्स)। क्या मैं वास्तव में चाहते हैं छवि में चक्र की वजह से

[dx,dy] = gradient(im); 

उपयोग करने के लिए छवि में वृत्त के किनारों का पता लगाने, और फिर ढाल सदिश क्षेत्र की गणना करने के लिए है। जाहिर है, आपको = x और v = y असाइन करना केवल मुझे एक सीधी रेखा का वेक्टर फ़ील्ड देगा - इसलिए मूल रूप से, मैं छवि के ढाल को वेक्टरों और वी में एम्बेड करना चाहता हूं। मैं यह कैसे कर सकता हूं?

my result

image that i am getting error with

+0

पर है आप littlecircle.png पोस्ट कर सकते हैं? –

उत्तर

13

आप कोड में एक गलती की है (उसके अलावा, यह ठीक काम करता है)। आप नीचे दिए गए बदलना चाहिए:

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) 

सूचना है कि मैं दोगुना करने के लिए im परिवर्तित नहीं करते हैं, इसके साथ सही ढंग से प्रदर्शित नहीं होता के बाद से imshow (uint8 की जरूरत है)। आपके छवि आयामों के आधार पर, आप ग्रेड वैक्टर देखने के लिए ज़ूम इन करना चाहते हैं।

आप एक वैक्टर छवि पर आरोपित के क्षेत्र में जूम, नीचे देख सकते हैं:

Gradient vectors of a circle in an image

बेहतर गुणवत्ता छवि http://i.stack.imgur.com/fQbwI.jpg

+0

उत्तर के लिए धन्यवाद। हालांकि मुझे लगता है कि मैंने पूरी तरह से समस्या को समझाया नहीं है। मेरे कोड में उत्पादित ग्रेडियेंट वेक्टर, और आपका कोड छवि में सर्कल के कारण ढाल वाले वैक्टर नहीं हैं। उत्पादित ढाल क्षेत्र सर्कल के लिए बाहर और सामान्य पर इंगित करना चाहिए। तो आप देखते हैं कि मैं बस x = x नहीं चाहता हूं, बल्कि आप = x दिशा में छवि डोमेन का ढाल। – brucezepplin

+0

यदि आप यह कोड चलाते हैं सभी साफ़ करें; im = imread ('littlecircle.png'); आईएम = आईएम (:,:, 1); आईएम = डबल (आईएम); [एनआर, एनसी] = आकार (आईएम); [डीएक्स, डीई] = ढाल (आईएम); क्विवर (डीएक्स, डीई); अपनी पसंद की किसी भी छवि पर, आप देखेंगे कि मैं क्या कर रहा हूं (देखें कि क्विवर प्लॉट कैसा दिखता है)। हालांकि यहां मैं बस एक स्केलर क्षेत्र का एक क्विवरप्लॉट लौट रहा हूं। हालांकि मैं वास्तविक वेक्टर फ़ील्ड को वापस लौटना चाहता हूं और बाद में अपने प्रोग्राम में वेक्टर फ़ील्ड का उपयोग करना चाहता हूं। – brucezepplin

+0

मुझे यकीन नहीं है कि आप क्या करना चाहते हैं। कोड में मैंने सर्कल से * वेक्टर * डॉट * पॉइंट को पोस्ट किया है (मैंने स्क्रीनशॉट में ज़ूम किया है)।बेशक, चूंकि आपके पास एक कम्प्यूटेशनल रूटीन है जो एक अलग स्थान (छवि) में ग्रेड की गणना करता है, वहीं मात्राओं के कारण वेक्टर सर्कल के लिए बिल्कुल सामान्य नहीं हो सकते हैं यानी "पूर्ण" ग्रेड वैक्टर को देखने की अपेक्षा न करें, जैसे कि विश्लेषणात्मक रूप से गणना की जाती है गणितीय सर्कल दिया गया। – Jorge