2012-02-13 6 views
6

Tôi muốn vẽ một hình chữ nhật để phác thảo một vùng của hình ảnh mà tôi đã vẽ trong một trục của một hình. Tôi có nhiều trục trong hình này, vì vậy tôi đang sử dụng hàm rectangle(). Những gì tôi muốn là vẽ một hình chữ nhật màu trắng một đường viền màu đen mỏng ngay bên trong và ngay bên ngoài hình chữ nhật. Một phần của hình ảnh bên trong hình chữ nhật sẽ hiển thị, vì vậy tất cả 'facecolor' nên là 'none'. Tôi đã thử vẽ 3 hình chữ nhật, hai hình chữ nhật màu đen với đường viền mỏng và một màu trắng đậm hơn, nhưng vấn đề là 'Vị trí' được xác định trong các đơn vị trục và 'LineWidth' được xác định theo đơn vị điểm, sao cho tỷ lệ không hoạt động quá tốt, đặc biệt là khi con số được thay đổi kích cỡ.Làm cách nào để tạo hình chữ nhật với đường viền được phác thảo?

FYI, đường viền để hình chữ nhật màu trắng hiển thị rõ hơn trên nền sáng. Các hình ảnh được vẽ rất đa dạng, vì vậy một màu duy nhất sẽ không được hiển thị phổ biến cho dữ liệu của tôi.

Bất kỳ đề xuất nào về cách tôi có thể thực hiện việc này?

Trả lời

7

Làm thế nào về việc chỉ sử dụng độ rộng đường kẻ khác nhau cho hình chữ nhật màu đen và trắng?

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, các góc nhìn tốt hơn nhiều về hình MATLAB hơn như PNG.

tốt hơn với getframe:

cameraman with rectangle (getframe)

+0

trình khá tốt cho việc thêm hình chữ nhật đến các lô MATLAB bình thường. –

3

Tôi thích giải pháp @Yuks. Nhưng có một khả năng khác mà bạn có thể xem xét:

Bạn cũng có thể tính giá trị trung bình của các pixel bên trong hình chữ nhật và đặt màu hộp thành nghịch đảo. Bằng cách này, bạn sẽ luôn có độ tương phản tốt.

enter image description here

Đây là mã:

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 

Và kiểm tra:

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

giải pháp Yuk của hoạt động khá tốt cho việc thêm một hình chữ nhật để một âm mưu MATLAB bình thường, quá. Các giá trị 'vị trí' không interpretet như pixel nhưng được điều chỉnh để các giá trị cốt truyện (xem mã ví dụ dưới đây):

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

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

kết quả Mã này trong cốt truyện như sau: enter image description here