MATLAB: disegno di una linea su un’immagine in bianco e nero

Qual è il modo migliore per disegnare una linea su un’immagine in bianco e nero (binaria) in MATLAB, a condizione che le coordinate di inizio e fine siano note?

Si prega di notare, non sto cercando di aggiungere una linea di annotazione. Vorrei che la linea diventasse parte dell’immagine.

Potresti voler dare una risposta alla mia domanda su come aggiungere una linea a una matrice di immagini . Ecco un esempio simile a quello che ho in quella risposta, che creerà una linea bianca che va dall’indice di riga e colonna (10, 10) a (240, 120) :

 img = imread('cameraman.tif'); % Load a sample black and white image x = [10 240]; % x coordinates y = [10 120]; % y coordinates nPoints = max(abs(diff(x)), abs(diff(y)))+1; % Number of points in line rIndex = round(linspace(y(1), y(2), nPoints)); % Row indices cIndex = round(linspace(x(1), x(2), nPoints)); % Column indices index = sub2ind(size(img), rIndex, cIndex); % Linear indices img(index) = 255; % Set the line points to white imshow(img); % Display the image 

Ed ecco l’immagine risultante:

inserisci la descrizione dell'immagine qui

Se sei infastidito da casi eccezionali di altri metodi, ecco un metodo a prova di proiettile che risulta in una linea:

  • i cui pixel si toccano sempre l’un l’altro durante l’intera lunghezza della linea (i pixel sono 8 vicini l’uno all’altro),
  • la densità della linea non dipende dal parametro aggiuntivo , ma è determinata in modo flessibile per contenere la garanzia dal primo punto.

Input (utile per fare funzionare fuori da questo codice):

  • img – matrice che contiene immagine,
  • x1 , y1 , x2 , y2 – coordinate dei punti finali della linea da tracciare.

Codice:

 % distances according to both axes xn = abs(x2-x1); yn = abs(y2-y1); % interpolate against axis with greater distance between points; % this guarantees statement in the under the first point! if (xn > yn) xc = x1 : sign(x2-x1) : x2; yc = round( interp1([x1 x2], [y1 y2], xc, 'linear') ); else yc = y1 : sign(y2-y1) : y2; xc = round( interp1([y1 y2], [x1 x2], yc, 'linear') ); end % 2-D indexes of line are saved in (xc, yc), and % 1-D indexes are calculated here: ind = sub2ind( size(img), yc, xc ); % draw line on the image (change value of '255' to one that you need) img(ind) = 255; 

Ecco l’immagine di esempio con tre linee disegnate sopra: inserisci la descrizione dell'immagine qui

Questo algoritmo offre un approccio.

In realtà è solo una modifica sulla risposta di plesiv. Sto disegnando migliaia di righe su un’immagine e ho bisogno di aumentare le prestazioni. Il maggior miglioramento apportato omettendo interp1 chiamate interp1 e l’utilizzo di variabili intere ha reso leggermente più veloce. Esegue circa il 18% più veloce sul mio PC rispetto al codice di plesiv.

 function img = drawLine(img, x1, y1, x2, y2) x1=int16(x1); x2=int16(x2); y1=int16(y1); y2=int16(y2); % distances according to both axes xn = double(x2-x1); yn = double(y2-y1); % interpolate against axis with greater distance between points; % this guarantees statement in the under the first point! if (abs(xn) > abs(yn)) xc = x1 : sign(xn) : x2; if yn==0 yc = y1+zeros(1, abs(xn)+1, 'int16'); else yc = int16(double(y1):abs(yn/xn)*sign(yn):double(y2)); end else yc = y1 : sign(yn) : y2; if xn==0 xc = x1+zeros(1, abs(yn)+1, 'int16'); else xc = int16(double(x1):abs(xn/yn)*sign(xn):double(x2)); end end % 2-D indexes of line are saved in (xc, yc), and % 1-D indexes are calculated here: ind = sub2ind(size(img), yc, xc); % draw line on the image (change value of '255' to one that you need) img(ind) = 255; end 

Se si dispone della casella degli strumenti di Computer Vision System, è ansible utilizzare insertShape .