Как я могу создать прямоугольник с обведенной рамкой? - PullRequest
6 голосов
/ 14 февраля 2012

Я хочу нарисовать прямоугольник, чтобы очертить область изображения, которую я нанес на одну из осей фигуры. У меня есть несколько осей на этом рисунке, поэтому я использую функцию rectangle (). То, что я хочу, это нарисовать белый прямоугольник тонкой черной рамкой только внутри и снаружи прямоугольника. Часть изображения внутри прямоугольника должна быть видимой, поэтому все «цвет лица» должен быть «нет». Я попытался нарисовать 3 прямоугольника, два черных с тонкой шириной линии и один более толстый белый, но проблема в том, что «Положение» определяется в единицах осей, а «Линия ширины» определяется в точечных единицах, так что масштабирование не работает слишком хорошо, особенно когда размер изменен.

К вашему сведению, контур таков, что белый прямоугольник лучше виден на светлом фоне. Графики изображений сильно различаются, поэтому один цвет не будет виден для моих данных повсеместно.

Любые предложения о том, как я могу это сделать?

Ответы [ 3 ]

7 голосов
/ 14 февраля 2012

Как насчет использования разной ширины линии для черно-белого прямоугольника?

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)

Хмм, на рисунке MATLAB углы выглядят намного лучше, чем в формате PNGфайл.

Лучше с getframe:

cameraman with rectangle (getframe)

3 голосов
/ 14 февраля 2012

Мне нравится решение @Yuks.Но есть и другая возможность, которую вы можете рассмотреть:

Вы также можете рассчитать среднее значение пикселей внутри прямоугольника и установить для цвета рамки значение инверсии. Таким образом, у вас всегда будет хороший контраст.

enter image description here

Вот код:

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

И тест:

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 голосов
/ 31 декабря 2013

Решение Юка хорошо работает и для добавления прямоугольника к обычному графику MATLAB. Значения 'position' не интерпретируются как пиксели, а корректируются в соответствии со значениями графика (см. Пример кода ниже):

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

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

Этот код приводит к следующему графику: enter image description here

...