Тулбокс включает две функции, которые можно использовать, чтобы найти контуры объектов в двухуровневом изображении:
Функция 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
Для определенных объектов необходимо заботиться при выборе краевого элемента изображения, который вы выбираете в качестве отправной точки и направления, которое вы выбираете для параметра первого шага (север, юг, и т.д.).
Например, если объект содержит дыру, и вы выбираете пиксель на тонкой части объекта как стартовый пиксель, можно проследить внешнюю границу объекта или внутреннюю границу дыры, в зависимости от направления, которое вы выбираете для первого шага. Для заполненных объектов направление, которое вы выбираете для параметра первого шага, не так важно.
Чтобы проиллюстрировать, эти данные показывают пиксели, прослеженные, когда стартовый пиксель находится на тонкой части объекта, и первый шаг установлен на север и юг. Возможность соединения установлена в 8 (значение по умолчанию).
Влияние параметров первого шага и направления на граничной трассировке