Итак, я пришел к следующей идее: для 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
Существует много места для улучшений кода, я хотел, чтобы он был читабельным и легким для понимания.Фелишисты с одним лайнером могут делать то, что им нравится.; -)