2015-03-22 2 views
0

Работа над 2D Прямоугольное вложение. Необходимо найти процент использования материала. Предполагая, что у меня есть длина, ширина, левое нижнее положение каждого прямоугольника. Каков наилучший способ определения использования Boundary-Cut?Как определить использование граничных сокращений MATLAB?

Цель: - найти ПЛОЩАДКУ под КРАСНОЙ ЛИНИЕЙ.

Образцы изображений, прилагаемые к изображению того, что я сделал и что мне нужно.

Что я сделал enter image description here

, что мне нужно enter image description here

Другой пример изображения прямоугольников, упакованных с учетом enter image description here

+0

Я бы поместил все эти прямоугольники в двоичное изображение, а затем проследил границу, используя алгоритм трассировки границ. Насколько гибко вы относитесь к алгоритму? Можем ли мы использовать ... сказать ... панель обработки изображений? Если можно, то вы можете очень легко получить то, что хотите, с комбинацией логической индексации и 'bwperim'. – rayryeng

+0

Не знаком с изображением Инструментарий для обработки изображений. но если вы используете bwperim, не будет ли он также иметь периметр для внутренних отверстий? не могли бы вы объяснить это дальше, может быть, с кодом? Я новичок в matlab @rayryeng –

+0

Отверстия, которые я не заметил. Вы можете просто заполнить отверстия с помощью 'imfill', затем извлечь внешний край с помощью' bwperim'. Вы правы, если бы мы использовали 'bwperim' прямо вверх, он получил бы периметр отверстий, поэтому лучше всего заполнить отверстия, используя' imfill' в первую очередь. У вас есть этот набор инструментов? Я мог бы объяснить это дальше, но мне нужно знать, как вы храните эти прямоугольники. Не могли бы вы предоставить какой-либо код, который вы написали, чтобы создать приведенный выше рисунок? Мне будет сложнее, если у меня его нет, так как я не знаю, как вы представляете эти прямоугольники. – rayryeng

ответ

1

Если вы заинтересованы в определении общей «площади» под красная линия, одно предложение у меня есть, если у вас есть доступ к 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(:)); 

Это подытожить все «белых» пикселей в изображении, которое эффективно площадь. Я не уверен, что вы на самом деле после, так что используйте тот или другой в зависимости от ваших потребностей.

+0

Мне действительно нужен один с заполненными отверстиями. если бы я хотел без заполненных отверстий, то, очевидно, я бы подвел итог области отдельных прямоугольников .. Отличное решение кстати. +1 –

+0

Хотя я знаю, что это выполнило бы мою работу, если бы вы могли придумать альтернативные ответы, которые не связаны с созданием изображений, пожалуйста, опубликуйте его. потому что мне нужно рассчитать процент использования для каждой итерации, например, около 80000.Я думаю, что создание образа и выполнение трюков для обработки изображений замедлит мой фактический процесс. –

+0

Можете ли вы также обобщить код для других выпуклых полигонов? Предположим, что у нас есть X, Y векторы вершин каждого многоугольника. можно ли это сделать с помощью «Инструментария обработки изображений»? –

0

Boundary-Cut Area без использования Image Processing Toolbox.

Детальное описание вопрос и ответ может быть найден here

Это решение применимо только для прямоугольных частей.

+0

, если кто-то может обобщить решение и для других выпуклых полигонов, пожалуйста, поделитесь им. я буду отмечать его как ** Ответ ** –

Смежные вопросы