Вопрос:
Я хочу сегментировать изображение на 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 части с помощью этих ребер? Я думаю, что метод выращивания области не работает здесь, так как линия не связана с концом изображения. Вы можете свободно загрузить первое изображение и протестировать его. Спасибо за помощь.
Лучший ответ:
Это краевые артефакты. 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))
Результат: