Если вы заинтересованы в определении общей «площади» под красная линия, одно предложение у меня есть, если у вас есть доступ к Image Processing Toolbox, просто создайте двоичное изображение, где мы нарисуем все прямоугольники на изображении сразу, fi ll все отверстия, затем, чтобы определить площадь, просто определите общую сумму всех двоичных «пикселей» на изображении. Вы сказали, что у вас есть (x,y)
положения нижнего левого угла каждого прямоугольника, а также ширина и высота каждого прямоугольника. Чтобы сделать это совместимым в контексте изображения, ось y
обычно переворачивается так, что верхний левый угол пространства является источником, а не нижним левым. Однако это не должно влиять на наш анализ, поскольку мы просто отражаем все 2D-пространство вниз.
Поэтому я бы начал с пустого изображения, которое имеет тот же размер, что и сетка, с которой вы имеете дело, а затем создайте цикл, который просто устанавливает прямоугольную сетку координат в true
для каждого прямоугольника, который у вас есть. После этого используйте imfill
, чтобы заполнить любое из отверстий на изображении, а затем вычислить общую сумму пикселей для получения области. Определение отверстия в контексте обработки изображений - это любые черные пиксели, которые полностью окружены белыми пикселями. Поэтому, если у нас есть пробелы, окруженные белыми пикселями, они будут заполнены белым.
Таким образом, если предположить, что у нас есть четыре отдельные переменные x
, y
, width
и height
, которые давно N
элементы, где N
является количество прямоугольников у вас есть, сделать что-то вроде этого:
N = numel(x); %// Determine total number of rectangles
rows = 100; cols = 200; %// Define dimensions of grid here
im = false(rows, cols); %// Declare blank image
%// For each rectangle we have...
for idx = 1 : N
%// Set interior of rectangle at location all to true
im(y(idx)+1:y(idx)+height(idx), x(idx)+1:x(idx)+width(idx)) = true;
end
%// Fill in the holes
im_filled = imfill(im, 'holes');
%// Determine total area
ar = sum(im_filled(:));
В индексирование в петле for
:
im(y(idx)+1:y(idx)+height(idx), x(idx)+1:x(idx)+width(idx)) = true;
Это немного сложно иметь дело. Имейте в виду, что я предполагаю, что y
обращается к строкам изображения и x
обращается к столбцам. Я также предполагаю, что x
и y
основаны на 0, поэтому источник находится в (0,0)
. Поскольку мы получаем доступ к массивам и матрицам в MATLAB, начиная с 1, нам нужно смещать координаты на 1. Теперь начальный индекс для строки начинается с y(idx)+1
. Мы заканчиваем на y(idx) + height(idx)
, потому что мы технически начинаем с y(idx)+1
, но тогда нам нужно подняться до height(idx)
, но затем мы также вычтем на 1, когда ваши координаты начинаются с 0. Возьмем, например, линию с шириной 20, от x = 0
до x = 19
. Эта ширина равна 20, но мы рисуем от 0 до 20-1
, что составляет 19.Из-за индексации, начинающейся с 1 для MATLAB, и вычитания 1 из-за индексации 0, отмены +1 и -1, поэтому мы просто остаемся с y(idx) + height(idx)
. То же самое можно сказать и с координатой x
и width
.
Как только мы рисуем все прямоугольники на изображении, мы используем imfill
, чтобы заполнить отверстия, а затем суммируем общую площадь, просто развернув все изображение в один вектор и вызывая sum
. Это должно (надеюсь) получить то, что вам нужно.
Теперь, если вы хотите, чтобы найти область без заполненного в отверстиях (я подозреваю, это то, что вам действительно нужно), то вы можете пропустить imfill
шаг. Просто применить sum
на im
, вместо im_filled
и так:
ar = sum(im(:));
Это подытожить все «белых» пикселей в изображении, которое эффективно площадь. Я не уверен, что вы на самом деле после, так что используйте тот или другой в зависимости от ваших потребностей.
Я бы поместил все эти прямоугольники в двоичное изображение, а затем проследил границу, используя алгоритм трассировки границ. Насколько гибко вы относитесь к алгоритму? Можем ли мы использовать ... сказать ... панель обработки изображений? Если можно, то вы можете очень легко получить то, что хотите, с комбинацией логической индексации и 'bwperim'. – rayryeng
Не знаком с изображением Инструментарий для обработки изображений. но если вы используете bwperim, не будет ли он также иметь периметр для внутренних отверстий? не могли бы вы объяснить это дальше, может быть, с кодом? Я новичок в matlab @rayryeng –
Отверстия, которые я не заметил. Вы можете просто заполнить отверстия с помощью 'imfill', затем извлечь внешний край с помощью' bwperim'. Вы правы, если бы мы использовали 'bwperim' прямо вверх, он получил бы периметр отверстий, поэтому лучше всего заполнить отверстия, используя' imfill' в первую очередь. У вас есть этот набор инструментов? Я мог бы объяснить это дальше, но мне нужно знать, как вы храните эти прямоугольники. Не могли бы вы предоставить какой-либо код, который вы написали, чтобы создать приведенный выше рисунок? Мне будет сложнее, если у меня его нет, так как я не знаю, как вы представляете эти прямоугольники. – rayryeng