2012-02-13 21 views
6

Desidero disegnare un rettangolo per delineare un'area di un'immagine che ho tracciato su un asse di una figura. Ho più assi in questa figura, quindi sto usando la funzione rectangle(). Quello che voglio è disegnare un rettangolo bianco un bordo nero sottile appena dentro e appena fuori dal rettangolo. La parte dell'immagine all'interno del rettangolo dovrebbe essere visibile, quindi tutto 'facecolor' dovrebbe essere 'none'. Ho provato a disegnare 3 rettangoli, due neri con linee sottili e uno più spesso bianco, ma il problema è che "Posizione" è definita in unità di assi e "LineWidth" è definita in unità puntiforme, quindi il ridimensionamento non funziona troppo bene, specialmente quando la figura viene ridimensionata.Come posso creare un rettangolo con un bordo delineato?

FYI, il contorno è in modo che il rettangolo bianco sia più visibile su uno sfondo chiaro. Le immagini tracciate variano molto, quindi un singolo colore non sarà universalmente visibile per i miei dati.

Qualche suggerimento su come posso farlo?

risposta

7

Che ne dici di utilizzare solo larghezze di linea diverse per il rettangolo bianco e nero?

imshow('cameraman.tif') 
rectangle('position',[80 30 100 100],'edgecolor','k','LineWidth',4) 
rectangle('position',[80 30 100 100],'edgecolor','w','LineWidth',1) 

cameraman with rectangle (Save As)

Hmm, gli angoli molto meglio sulla figura di MATLAB che come file PNG.

meglio con getframe:

cameraman with rectangle (getframe)

+0

funziona abbastanza bene per l'aggiunta di rettangoli anche ai normali tracciati MATLAB. –

3

mi piace @Yuks soluzione. Ma c'è un'altra possibilità che è possibile prendere in considerazione:

Si può anche calcolare il valore medio dei pixel all'interno del rettangolo e impostare il colore della casella sull'inverso. In questo modo, avrai sempre un buon contrasto.

enter image description here

Ecco il codice:

function PlotRect(im,x,y,w,h) 
    m = double(im(round(y): round(y+h) , round(x): round(x+w),:)); 
    if (mean(m(:)) < 255/2) 
     col = [1 1 1]; 
    else 
     col = [0 0 0]; 
    end 
    rectangle('Position',[x y w h],'EdgeColor', col); 
end 

E il test:

function Inverse() 

    im = imresize(uint8(0:5:255), [250, 400]) ; 
    figure;imshow(im); hold on; 

    PlotRect(im,5,8,50,75); 
    PlotRect(im,100,30,25,42); 
    PlotRect(im,200,10,40,40); 
    PlotRect(im,300,10,40,40); 
end 
2

soluzione di Yuk funziona abbastanza bene per l'aggiunta di un rettangolo per una trama MATLAB normale, anche. I valori di 'posizione' non sono interpretet come pixel, ma sono adeguati ai valori di trama (vedi esempio di codice qui sotto):

figure; 
plot(0:10,0:10); grid on; 

hold on; 
rectangle('position',[1 1 8.5 8.5],'LineWidth',2); 
hold off; 

risultati questo codice nel seguente grafico: enter image description here

Problemi correlati