Сегментация изображения Matlab с использованием краев линии

Linux
Вопрос:Я хочу сегментировать изображение на 3 части, как показано на рисунке 2. Первая работа, которую я проделал, - использовать определение canny edge для извлечения краев, как показано на рисунке 3, используя код ниже. rgb = imread('Camera_205.png'); I = rgb2gray(rgb); imshow(I) figure BW = edge(I,'canny',0.6); BW = bwareaopen(BW, 80); imshow(BW); Мой вопрос заключается в том, как

Вопрос:

Я хочу сегментировать изображение на 3 части, как показано на рисунке 2. Первая работа, которую я проделал, – использовать определение canny edge для извлечения краев, как показано на рисунке 3, используя код ниже.

rgb = imread(‘Camera_205.png’); I = rgb2gray(rgb); imshow(I) figure BW = edge(I,’canny’,0.6); BW = bwareaopen(BW, 80); imshow(BW);

Мой вопрос заключается в том, как сегментировать изображение на 3 части с помощью этих ребер? Я думаю, что метод выращивания области не работает здесь, так как линия не связана с концом изображения. Вы можете свободно загрузить первое изображение и протестировать его. Спасибо за помощь. Оригинальное цветное изображение
Изображение, которое нужно сегментировать на 3 части
Edge image

Лучший ответ:

Это краевые артефакты. Canny использует градиенты внутри, и неясно, как вычислять градиент на границах изображения (также они размыты внутри matlab edge). Просто обрезайте изображение BW.

EDIT:

Значение sigma для гауссовского размытия по умолчанию edge равно 1,41 пикселю. Итак, если вы обрезаете примерно вдвое больше и еще 2 пикселя для учета ядра sobel, используемого для вычисления градиента (всего 5 пикселей) от каждого края (я имею в виду край изображения, а не обнаруженные края), вы избавитесь от краевые артефакты.

Подобно этому

BW_cropped = BW(5:end-5,5:end-5)

Затем добавьте обратно эти 5 пикселей к каждой координате, если ваша обработка изображений включает в себя поиск позиции чего-либо на изображении.

EDIT2:

Например, чтобы получить все пиксели в областях обрезанного изображения, используйте bwconncomp на инвертированном изображении следующим образом:

CC=bwconncomp(not(BW_cropped),4);

Результат:

>> CC CC = Connectivity: 4 ImageSize: [471 631] NumObjects: 3 PixelIdxList: {[40405×1 double] [254682×1 double] [1430×1 double]}

Итак, вы получаете и выводите структуру, где поле PixelIdxList дает вам три элемента (количество областей) индексов всех пикселей в ваших регионах (индексирование в cropped_BW).

Затем вы можете использовать функцию CC в regionprops, чтобы получить информацию о ваших регионах (например, область или центр тяжести, см. справку обо всех ошибках)

EDIT3:

Пример кода:

a = imread(‘XEDCa.png’); I = rgb2gray(a); BW = edge(I,’canny’,0.6); BW_cropped = BW(5:end-5,5:end-5); CC=bwconncomp(not(BW_cropped),4) imagesc(labelmatrix(CC))

Результат:

Оцените статью
Добавить комментарий