2009-12-21 15 views
9

मैं एक अच्छी तरह से परिभाषित बिंदु से दूसरे में एक रेखा को प्लॉट करना चाहता हूं और फिर इसे चिकनाई के लिए गॉसियन फ़िल्टर का उपयोग करने के लिए एक छवि मैट्रिक्स में बदलना चाहता हूं। इसके लिए मैं एक पंक्ति प्लॉट करने और छवि में आकृति विंडो को कैप्चर करने के लिए line और getframe फ़ंक्शंस का उपयोग करता हूं, लेकिन getframe बहुत धीमा और बहुत विश्वसनीय नहीं है। मैंने देखा कि कंप्यूटर लॉक होने पर यह कुछ भी कैप्चर नहीं करता है और मुझे 170 निष्पादन के बाद out of memory त्रुटि मिली है।MATLAB में इसमें खींची गई रेखा के साथ मैं एक छवि मैट्रिक्स कैसे बना सकता हूं?

मेरे प्रश्न हैं:

  • वहाँ getframe है कि मैं का उपयोग कर सकते करने के लिए एक विकल्प के है?
  • क्या छवि मैट्रिक्स बनाने और सीधे इसमें रेखा खींचने का कोई तरीका है?

यहाँ एक न्यूनतम कोड नमूना है:

figure1=line([30 35] ,[200 60]); 
F= getframe; 
hsize=40; sigma=20; 
h = fspecial('gaussian',hsize,sigma); 
filteredImg = imfilter(double(F.cdata), h,256); 
imshow(uint8(filteredImg)); 

[अद्यतन]

उच्च प्रदर्शन linspace साथ मार्क विचार बहुत आशाजनक दिखता है, लेकिन मैं कैसे उपयोग करते हैं मैट्रिक्स के साथ गणना निर्देशांक linspace? मैंने निम्नलिखित कोड की कोशिश की, लेकिन यह काम नहीं करता है क्योंकि मुझे लगता है कि यह चाहिए। मुझे लगता है यह एक बहुत ही सरल और बुनियादी MATLAB बात है, लेकिन मैं सिर्फ यह आसपास मेरे सिर लपेटो नहीं कर सकते हैं:

matrix=zeros(200,60); 
diagonal=round([linspace(30,200,numSteps); linspace(35,60,numSteps)]); 
matrix(diagonal(1,:), diagonal(2,:))=1; 
imshow(matrix); 
+0

तो, तुम क्या कर रहे एक वेक्टर छवि की rasterisation है। इस विषय पर बहुत सारे अच्छे संदर्भ, विकिपीडिया, हमेशा के रूप में, शुरू करने के लिए एक अच्छी जगह है। –

+0

मुझे पता है, लेकिन मैं हमेशा Matlab अपने कार्यों का उपयोग करने की कोशिश करता हूं। मैं ज्यादा नहीं सीखता, लेकिन वे तेज़ हैं और मुझे अपने कोड की तरह उन्हें डिबग करने में समय बिताना नहीं है। – Framester

उत्तर

15

यहाँ एक मैट्रिक्स में सीधे एक रेखा खींचने का एक उदाहरण है। तब

mat = zeros(250, 250, 'uint8'); % A 250-by-250 matrix of type uint8 

, मान लें कि हम एक लाइन (30, 35) से (200, 60) के लिए चल आकर्षित करने के लिए चाहते हैं: सबसे पहले, हम एक खाली छवि के लिए शून्य के एक मैट्रिक्स पैदा हो जाएगी। ,

linspace का उपयोग कर लाइन पिक्सल के लिए
x = [30 200]; % x coordinates (running along matrix columns) 
y = [35 60]; % y coordinates (running along matrix rows) 
nPoints = max(abs(diff(x)), abs(diff(y)))+1; % Number of points in line 

इसके बाद, हम गणना पंक्ति और स्तंभ सूचकांक sub2ind का उपयोग कर रैखिक सूचकांक को subscripted सूचकांक से उन्हें बदलने के लिए, तो: हम पहले की गणना की जाती है कि कितने पिक्सल लाइन लंबी हो करना होगा संशोधित करने के लिए उन्हें इस्तेमाल mat:

rIndex = round(linspace(y(1), y(2), nPoints)); % Row indices 
cIndex = round(linspace(x(1), x(2), nPoints)); % Column indices 
index = sub2ind(size(mat), rIndex, cIndex);  % Linear indices 
mat(index) = 255; % Set the line pixels to the max value of 255 for uint8 types 

तो आप लाइन और निम्नलिखित के साथ फ़िल्टर्ड संस्करण कल्पना कर सकते हैं:

subplot(1, 2, 1); 
image(mat);  % Show original line image 
colormap(gray); % Change colormap 
title('Line'); 

subplot(1, 2, 2); 
h = fspecial('gaussian', 20, 10); % Create filter 
filteredImg = imfilter(mat, h); % Filter image 
image(filteredImg);    % Show filtered line image 
title('Filtered line'); 

enter image description here

+0

धन्यवाद आपके व्यापक उत्तर के लिए gnovice! – Framester

0

कुछ इस तरह:

[linspace (30,200, numSteps); लिन्स स्पेस (35,60, numSteps)]

क्या यह आपके लिए काम करता है?

मार्क

+0

लिन्सस्पेस बहुत ही आशाजनक दिखता है, लेकिन मैं लिंस्पेस के साथ गणना की गई मैट्रिक्स 'निर्देशांक तक कैसे पहुंचूं? मैंने पिछले 30 मिनटों की कोशिश की, लेकिन निम्न कोड काम नहीं करता है, जैसा कि मुझे लगता है कि यह चाहिए .. (scnr) मुझे लगता है, यह एक बहुत ही सरल और बुनियादी Matlab बात है, लेकिन मैं बस इसके चारों ओर अपने सिर लपेट नहीं सकता। मैट्रिक्स = शून्य (200,60); विकर्ण = दौर ([लिंस्पेस (30,200, numSteps); लिन्स स्पेस (35,60, numSteps)]); मैट्रिक्स (विकर्ण (1, :), विकर्ण (2,:)) = 1; imshow (मैट्रिक्स); – Framester

0

आप मेरा उत्तर here देख सकते हैं। आप जो मांग रहे हैं उसे हासिल करने के लिए यह एक मजबूत तरीका है। मेरे दृष्टिकोण का लाभ यह है कि इसे खींची गई रेखा के घनत्व को नियंत्रित करने के लिए अतिरिक्त पैरामीटर की आवश्यकता नहीं है।

3

यदि आपके पास कंप्यूटर विजन सिस्टम टूलबॉक्स है तो एक आकार Inserter ऑब्जेक्ट उपलब्ध है। इसका उपयोग छवि पर रेखाओं, मंडल, आयताकारों और बहुभुजों को आकर्षित करने के लिए किया जा सकता है।

mat = zeros(250,250,'uint8'); 
shapeInserter = vision.ShapeInserter('Shape', 'Lines', 'BorderColor', 'White'); 
y = step(shapeInserter, mat, int32([30 60 180 210])); 
imshow(y); 

http://www.mathworks.com/help/vision/ref/vision.shapeinserterclass.html

संबंधित मुद्दे

 संबंधित मुद्दे