2012-02-13 17 views
6

Quiero dibujar un rectángulo para delinear un área de una imagen que he trazado en un eje de una figura. Tengo varios ejes en esta figura, así que estoy usando la función de rectángulo(). Lo que quiero es dibujar un rectángulo blanco con un delgado borde negro dentro y justo fuera del rectángulo. La parte de la imagen dentro del rectángulo debe ser visible, por lo que todo 'facecolor' debe ser 'none'. He intentado dibujar 3 rectángulos, dos negros con anchos de línea delgados y uno blanco más grueso, pero el problema es que 'Posición' se define en unidades de ejes y 'Ancho de línea' se define en unidades de puntos, por lo que la escala no funciona demasiado bien, especialmente cuando se cambia el tamaño de la figura.¿Cómo puedo crear un rectángulo con un borde delimitado?

FYI, el contorno es para que el rectángulo blanco sea más visible sobre un fondo claro. Las imágenes trazadas varían ampliamente, por lo que un solo color no será universalmente visible para mis datos.

¿Alguna sugerencia sobre cómo puedo hacer esto?

Respuesta

7

¿Qué tal si usamos diferentes anchuras de línea para el rectángulo en blanco y negro?

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, las esquinas se ven mucho mejor en la figura MATLAB que como archivo PNG.

Mejor con getframe:

cameraman with rectangle (getframe)

+0

funciona bastante bien para añadir rectángulos a las tramas normales de MATLAB, también. –

3

me gusta @Yuks solución. Pero existe otra posibilidad que puede considerar:

También puede calcular el valor medio de los píxeles dentro del rectángulo y establecer el color del cuadro en el inverso. De esta manera, siempre tendrá un buen contraste.

enter image description here

Aquí está el código:

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 

Y la prueba:

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

solución de Yuk funciona bastante bien para añadir un rectángulo a una parcela de MATLAB normal, también. Los valores de 'posición' no se interpretet como píxeles, pero se ajustan a los valores de la trama (véase el ejemplo de código siguiente):

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

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

resultados este código en el siguiente diagrama: enter image description here

Cuestiones relacionadas