Как классифицировать ребра с закрытыми границами или нет в Matlab? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть следующее изображение (заменено на лучшее изображение в режиме EDIT):

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

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

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

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

Как можно решить эту проблему для bwboundaries для 2-гообъект И правильно классифицировать их как разные объекты (граница первого должна начинаться и заканчиваться в одной и той же точке, граница второго должна начинаться и заканчиваться в разных точках)?

РЕДАКТИРОВАТЬ:

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

enter image description here

1 Ответ

0 голосов
/ 07 марта 2019

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

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 object\n');
  elseif (ratio < lowerThr)
    printf('1d object\n');
  else
    printf('No idea\n');
  end
end

Существует много места для улучшений кода, я хотел, чтобы он был читабельным и легким для понимания.Фелишисты с одним лайнером могут делать то, что им нравится.; -)

...