Одной из проблем с вашим кодом является звонок на imfill
. Поскольку изображение имеет яркие значения по всему изображению, считается, что есть большой объект с отверстием, и ваши реальные объекты находятся внутри этого отверстия. imfill
заполняет отверстие, оставляя все изображение белым.
Вместо этого я предлагаю следующий код для удаления рамки:
Image = rgb2gray(imread('https://i.stack.imgur.com/fmqAF.jpg'));
BW = imbinarize(Image);
BW = BW - bpropagation(false(size(BW)), BW);
Поскольку мы использовали фильтр в DIPimage, * Переменная 1008 * теперь содержит объект dip_image
, а не обычный массив MATLAB. dip_array(BW)
извлекает обычный массив MATLAB, который находится внутри. Объект dip_image
ведет себя не так, как массив MATLAB. Например, вы можете отобразить его в интерактивном окне рисунков, просто набрав его имя:
BW
Далее мы применяем маркировку, чтобы мы знали, какой идентификатор объекта в данных измерений соответствует какому объекту:
lab = label(BW);
dipshow(lab,'labels')
Теперь мы можем применить функцию измерения. Если мы используем BW
в качестве входных данных, label
будет вызываться на нем. Поскольку у нас уже есть этот результат, давайте использовать его напрямую:
msr = measure(lab, [], {'size', 'perimeter','podczeckShapes'});
Давайте рассмотрим результаты для объекта ID 8, который является большим квадратом:
sz = msr(8).size
square = msr(8).podczeckShapes(1)
triangle = msr(8).podczeckShapes(3)
Есть и другие вещи, которые вы можете делать со структурой измерения, я предлагаю вам прочитать документацию . Например, мы можем убрать из него измерения для самых маленьких объектов, которые для меня выглядят как шум:
msr = msr(msr.size>100); % remove measurement for noise