2009-12-21 20 views
9

Voglio tracciare una linea da un punto ben definito a un altro e quindi trasformarla in una matrice di immagini per utilizzare un filtro gaussiano su di esso per la levigatura. Per questo uso le funzioni line e getframe per tracciare una linea e acquisire la finestra della figura in un'immagine, ma getframe è molto lento e poco affidabile. Ho notato che non cattura nulla quando il computer è bloccato e ho ricevuto un errore out of memory dopo 170 esecuzioni.Come si crea una matrice di immagini con una linea disegnata in MATLAB?

Le mie domande sono:

  • C'è un sostituto per getframe che posso usare?
  • C'è un modo per creare la matrice immagine e tracciare la linea direttamente in essa?

Ecco un esempio di codice minima:

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)); 

[update]

ad alte prestazioni l'idea di Marco con linspace sembra molto promettente, ma come faccio ad accedere alla matrice coordinate calcolate con linspace? Ho provato il seguente codice, ma non funziona come penso che dovrebbe. Suppongo che sia una cosa molto semplice e di base MATLAB, ma non riesco proprio a avvolgere la mia testa intorno ad esso:

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

Allora, che cosa si sta facendo è rasterizzazione di un'immagine vettoriale. Un sacco di buone referenze su questo argomento, Wikipedia, come sempre, è un buon punto di partenza. –

+0

Lo so, ma cerco sempre di usare le stesse funzioni di Matlab. Non imparo tanto, ma sono più veloci e non devo passare il tempo a debuggarle come il mio codice. – Framester

risposta

15

Ecco un esempio di tracciare una linea direttamente in una matrice. In primo luogo, creeremo una matrice di zeri per un'immagine vuota:

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

Quindi, diciamo che vogliamo tracciare una linea che parte da (30, 35) a (200, 60). Ci prima calcolare quanti pixel tempo la linea dovrà essere:

indici
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 

Successivamente, calcola di righe e colonne per i pixel di linea utilizzando linspace, convertirli da indici con indice a indici lineari utilizzando sub2ind, poi usarli per modificare 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 

È quindi possibile visualizzare la linea e la versione filtrata con il seguente:

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

Grazie gnovice per la tua risposta completa! – Framester

0

Qualcosa di simile a questo:

[linspace (30.200, numSteps); linspace (35,60, numSteps)]

Funziona per voi?

Mark

+0

Linspace sembra molto promettente, ma come posso accedere alle coordinate della matrice calcolate con linspace? Ho provato gli ultimi 30 minuti, ma il codice seguente non funziona, come penso che dovrebbe .. (scnr) Presumo, è una cosa Matlab molto semplice e di base, ma non riesco a capirlo. Matrice = zero (200,60); diagonal = round ([linspace (30.200, numSteps); linspace (35,60, numSteps)]); Matrice (diagonale (1, :), diagonale (2,:)) = 1; imshow (matrice); – Framester

0

È possibile controllare la mia risposta here. È un modo efficace per ottenere ciò che stai chiedendo. Il vantaggio del mio approccio è che non ha bisogno di parametri aggiuntivi per controllare la densità della linea tracciata.

3

Se si dispone di toolbox Computer Vision System, è disponibile un oggetto ShapeInserter. Questo può essere usato per disegnare linee, cerchi, rettangoli e poligoni sull'immagine.

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

Problemi correlati