Нечетные координаты ограничивающей рамки в Matlab

Я использую regionprops(img,'BoundingBox'); для создания ограничивающих рамок вокруг некоторых объектов на изображении. Координаты ограничивающих рамок (x, y, width, height) всегда отличаются на 0,5 от целочисленных значений. Почему это так?

Для меня это вызывает две проблемы:

  • При использовании этих координат для доступа к массиву изображений я получаю предупреждение: Warning: Integer operands are required for colon operator when used as index. Я могу с этим жить, соответственно удалить с floor или ceil, НО...
  • ... когда эти координаты близки к границам изображения, они вызывают ошибки, так как значения 0,5 и 1024,5 не совпадают с границами изображения 1 и 1024. Я получаю Subscripted assignment dimension mismatch. или Index exceed matrix dimensions., что правдоподобно.

Так может кто-нибудь объяснить мне:

  1. Зачем это делается?
  2. Как мне с этим работать при использовании координат для обрезки и замены областей изображения. Я хочу заменить именно то, что было обрезано imcrop, а округление немного условно (простое использование floor или ceil не сработает, мне нужно будет проверить границы изображения, что не является проблемой, но кажется немного утомительным для довольно простого задача и, конечно, сомнительно, чтобы она использовалась таким образом...).

Ниже приведены некоторые фрагменты кода, с помощью которых я выдал ошибки для изображения 1024x1024.

bb_coords = [124.5  979.5   27  45];   % example for bounding box generated by regionprops
subregion = imcrop(img, bb_coords);    % works fine with imcrop

% but when I want to use these coordinates for accessing the img array, 
% I generally get a warning and in this case an error.
img( bb_coords(2):(bb_coords(2)+bb_coords(4)), ...
     bb_coords(1):(bb_coords(1)+bb_coords(3))) = subregion;

person Honeybear    schedule 10.05.2017    source источник


Ответы (1)


Функции в MATLAB, которые управляют отображением или обработкой изображения, рассматривают центр пикселя как совмещенный с соответствующими точками координатной сетки. Другими словами, для данного размера изображения центр первого пикселя находится в точке 1, центр второго пикселя — в точке 2 и т. д., а площадь каждого пикселя будет составлять +-0,5 по обе стороны от координаты. Вы можете увидеть это, когда рисуете изображение, включаете отображение осей и увеличиваете масштаб вокруг одного из углов:

img = imread('cameraman.tif');  % Load a sample image
imshow(img);                    % Display it
set(gca, 'Visible', 'on');      % Make the axes visible
axis([0 5 252 257]);            % Zoom in on the bottom left corner

В документации для regionprops показано, что 'BoundingBox' будет охватывать весь пикселя, что приводит к ограничивающей рамке, которая выглядит на целый пиксель шире (на 0,5 пикселя шире с каждой стороны), чем диапазон координат центра:

введите здесь описание изображения

Для приведенного выше образца изображения 5 на 5 ненулевые пиксели покрывают область, которая охватывает верхние 4 строки (координаты строк с центрами пикселей от 1 до 4) и правые 4 столбца (столбцы с координатами центров пикселей от 2 до 5). ). Таким образом, ограничительная рамка (зеленая) занимает от 0,5 до 4,5 (высота 4) по строкам и от 1,5 до 5,5 (ширина 4) по столбцам.

Короче говоря, если вы хотите использовать значения ограничительной рамки в bb_coords для создания индексов в изображении, вам нужно добавить 0,5 к координате каждого угла и вычесть 1 из каждой ширины:

ind_coords = bb_coords + [0.5 0.5 -1 -1];
img(ind_coords(2):(ind_coords(2)+ind_coords(4)), ...
    ind_coords(1):(ind_coords(1)+ind_coords(3))) = subregion;
person gnovice    schedule 10.05.2017
comment
Спасибо за исчерпывающий ответ, помогло. Теперь я использую эту технику как для обрезки, так и для вставки в изображение. imcrop(), похоже, использует другую технику, которая не нарушает границы изображения, но создает массивы изображений, которые отличаются (как правило, больше), чем те, которые создаются путем индексирования с помощью вашей математики: ind_coords = bb_coords + [0.5 0.5 -1 -1]; subregion = img(ind_coords(2):(ind_coords(2)+ind_coords(4)), ... ind_coords(1):(ind_coords(1)+ind_coords(3))); - person Honeybear; 10.05.2017
comment
Быстрая визуальная проверка, кажется, подтверждает это, но гарантируется ли, что все пиксели области находятся в пределах координат ограничивающей рамки, обрезанных таким образом? Просто задумался, так как обрезанные области меньше результатов imcrop(). - person Honeybear; 10.05.2017
comment
@Honeybear: я точно не знаю, как imcrop выполняет обрезку, но выбор субрегиона только путем индексации с использованием индексов, рассчитанных выше, должен гарантировать, что все пиксели, появляющиеся в области ограничивающей рамки, должны находиться в пределах обрезанной области. - person gnovice; 10.05.2017