Трассировка контура в изображениях

Тулбокс включает две функции, которые можно использовать, чтобы найти контуры объектов в двухуровневом изображении:

Функция bwtraceboundary возвращает координаты строки и столбца всех пикселей на границе объекта в изображении. Необходимо задать местоположение краевого элемента изображения на объекте как отправная точка для трассировки.

Функция bwboundaries возвращает координаты строки и столбца краевых элементов изображения всех объектов в изображении.

И для функций, ненулевые пиксели в двухуровневом изображении принадлежат объекту, и для пиксели со значением 0 (нуль) составляют фон.

Проследите контуры объектов в изображениях

Этот пример показывает, как проследить границу объекта в двухуровневом изображении с помощью bwtraceboundary. Затем с помощью bwboundaries пример прослеживает границы всех объектов в изображении.

Считайте изображение и отобразите его.

I = imread('coins.png');
imshow(I)

Преобразуйте изображение в двухуровневое изображение. bwtraceboundary и bwboundaries только работают с двухуровневыми изображениями.

BW = im2bw(I);
imshow(BW)

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

dim = size(BW)
dim = 1×2

   246   300

col = round(dim(2)/2)-90;
row = min(find(BW(:,col)))
row = 27

Вызовите bwtraceboundary, чтобы проследить контур от заданной точки. Как требуется аргументы, необходимо задать двухуровневое изображение, координаты строки и столбца отправной точки и направление первого шага. Пример задает север ('N').

boundary = bwtraceboundary(BW,[row, col],'N');

Отобразите исходное полутоновое изображение и используйте координаты, возвращенные bwtraceboundary, чтобы построить границу на изображении.

imshow(I)
hold on;
plot(boundary(:,2),boundary(:,1),'g','LineWidth',3);

Чтобы проследить контуры всех монет в изображении, используйте функцию bwboundaries. По умолчанию bwboundaries находит контуры всех объектов в изображении, включая объекты в других объектах. В двухуровневом изображении, используемом в этом примере, некоторые монеты содержат черные области, которые bwboundaries интерпретирует как отдельные объекты. Чтобы гарантировать, что bwboundaries только прослеживает монеты, используйте imfill, чтобы заполнить область в каждой монете. bwboundaries возвращает массив ячеек, где каждая ячейка содержит координаты строки/столбца для объекта в изображении.

BW_filled = imfill(BW,'holes');
boundaries = bwboundaries(BW_filled);

Постройте границы всех монет на исходном полутоновом изображении с помощью координат, возвращенных bwboundaries.

for k=1:10
   b = boundaries{k};
   plot(b(:,2),b(:,1),'g','LineWidth',3);
end

Выберите First Step и Direction for Tracing

Для определенных объектов необходимо заботиться при выборе краевого элемента изображения, который вы выбираете в качестве отправной точки и направления, которое вы выбираете для параметра первого шага (север, юг, и т.д.).

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

Чтобы проиллюстрировать, эти данные показывают пиксели, прослеженные, когда стартовый пиксель находится на тонкой части объекта, и первый шаг установлен на север и юг. Возможность соединения установлена в 8 (значение по умолчанию).

Влияние параметров первого шага и направления на граничной трассировке