2012-02-13 17 views
6

Chcę narysować prostokąt, aby obrysować obszar obrazu, który wykreśliłem w jednej osi figury. Na tej figurze mam wiele osi, więc używam funkcji rectangle(). To, czego chcę, to narysować biały prostokąt cienką czarną obwódką tuż wewnątrz prostokąta. Część obrazu wewnątrz prostokąta powinna być widoczna, więc wszystkie kolory powinny mieć wartość "none". Próbowałem rysować 3 prostokąty, dwa czarne o cienkich liniach i jeden grubszy biały, ale problem polega na tym, że "Położenie" jest definiowane w jednostkach osi, a "Szerokość linii" jest definiowana w jednostkach punktowych, więc skalowanie nie działa zbyt dobrze, szczególnie, gdy wielkość jest zmieniana.Jak utworzyć prostokąt z obramowaniem?

FYI, kontur jest tak, że biały prostokąt jest bardziej widoczny na jasnym tle. Obrazy wykreślone są bardzo różne, więc jeden kolor nie będzie powszechnie widoczny dla moich danych.

Jakieś sugestie, jak mogę to zrobić?

Odpowiedz

7

Co powiesz na temat używania różnych szerokości linii dla czarnego i białego prostokąta?

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, narożniki wyglądają o wiele lepiej niż na rysunku MATLAB jako plik PNG.

Better with getframe:

cameraman with rectangle (getframe)

+0

działa całkiem dobrze do dodawania prostokątów do normalnych działek MATLAB. –

3

Lubię @Yuks rozwiązanie. Istnieje jednak inna możliwość, którą można rozważyć:

Można również obliczyć średnią wartość pikseli wewnątrz prostokąta i ustawić kolor pola na odwrotność. W ten sposób zawsze będziesz mieć dobry kontrast.

enter image description here

Oto kod:

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 

a 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

rozwiązanie Yuk za działa całkiem dobrze do dodawania prostokąt do normalnego MATLAB działki, zbyt. Wartości pozycji „” nie są interpretet jako piksele, ale są dostosowane do wartości działki (patrz przykład kodu poniżej):

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

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

wyników Ten kod w poniższym wykresie: enter image description here

Powiązane problemy