Как классифицировать ребра с замкнутыми границами или без них в Matlab?

#matlab #image-processing #edge-detection

#matlab #обработка изображений #обнаружение ребер

Вопрос:

У меня есть следующее изображение (заменено лучшим изображением при РЕДАКТИРОВАНИИ):

Если я использую bwboundaries для первого объекта (white blob), я бы ожидал, что граница пройдет по внешней части этого первого белого объекта

Если я использую bwboundaries для второго объекта (горизонтальная белая линия), граница — это просто горизонтальная линия.

Я надеялся, что есть способ, который bwboundaries или какой-либо другой метод может каким-то образом классифицировать эти 2 объекта по-разному. То есть можно сказать, что граница первого объекта начинается и заканчивается в одной и той же точке, в то время как для второго объекта она начинается с левого конца и заканчивается на правом конце

Однако, если я внимательно посмотрю на то, как bwboundaries пересекает эти объекты, я замечаю, что для первого объекта он пересекает его один раз на 360 градусов. Но для второго объекта он фактически начинается с левой границы изображения, переходит к правой границе изображения, А ЗАТЕМ ВОЗВРАЩАЕТСЯ к левой границе изображения.

Как я могу исправить эту проблему для bwboundaries для 2-го объекта и правильно классифицировать их как разные объекты (граница 1-го должна начинаться и заканчиваться в одной точке, граница 2-го ДОЛЖНА начинаться и заканчиваться в РАЗНЫХ точках)?

Редактировать:

Это изображение получше

введите описание изображения здесь

Комментарии:

1. На мой взгляд, различие между этими двумя классами объектов может быть недостаточно четко определено. Если бы ширина линии составляла два пикселя, к какому классу она принадлежала бы?

2. Если ширина линии составляет два пикселя, для меня не имеет значения, к какому классу она принадлежит. Мне просто нужен способ отличить линию шириной в один пиксель от общих больших объектов / полигонов

3. да, я уже знаю о regionprops . Я не понимаю, как какое-либо из его свойств позволило бы мне классифицировать линии по сравнению с большими объектами

4. Просто для пояснения, объект шириной в один пиксель не обязательно должен быть прямой линией. Это может быть кривая или изогнутая линия, как на обновленном изображении, которое я поместил в раздел РЕДАКТИРОВАНИЯ. Этот объект шириной в один пиксель все равно следует классифицировать иначе, чем большие двоичные объекты / полигоны

5. Отсюда : B = bwboundaries(BW) отслеживает внешние границы объектов[…] , а bwboundaries функция реализует алгоритм трассировки Мура-соседа […] . Поэтому загляните в википедию . Вкратце: Контур по определению равен окрестности 3×3, таким образом, даже для объектов шириной в 1 пиксель у вас есть замкнутый контур.

Ответ №1:

Итак, мне пришла в голову следующая идея: для 2d-объектов граница, скорее всего, имеет уникальные (x, y) координаты. Для одномерных объектов большинство (если не все) (x, y) значений должны присутствовать два раза. Итак, для каждой границы мы просто определяем unique значения, или, если быть более точным, unique строки, и проверяем, значительно ли уменьшилось их количество, например, используя соотношение (#уникальные строки) / (#все строки). Простым вариантом было бы установить одно или несколько пороговых значений для отношения, например, ratio > 0.95 должен быть 2d-объект, поскольку большинство значений уникальны, и ratio < 0.55 должен быть одномерный объект, поскольку большинство значений присутствовали два раза.

 img = uint8(zeros(100));
img(10:20, 10:90) = 255;
img(80, 10:90) = 255;
imshow(img);

upperThr = 0.95;
lowerThr = 0.55;

B = bwboundaries(img);
for k = 1:numel(B)
  b = B{k};
  origLength = size(b, 1);
  b = unique(b, 'rows');
  uniqueLength = size(b, 1);
  ratio = uniqueLength / origLength;
  printf('Object %d: ', k);
  if (ratio > upperThr)
    printf('2d objectn');
  elseif (ratio < lowerThr)
    printf('1d objectn');
  else
    printf('No idean');
  end
end
  

Здесь достаточно места для улучшений кода, я хотел, чтобы он был читабельным и простым в использовании. Фетишисты, придерживающиеся одной строки, могут делать то, что им нравится. 😉