Мера DIPimage отсутствует аргумент - PullRequest
2 голосов
/ 12 апреля 2020

enter image description here Я пытаюсь использовать DIPimage, чтобы получить некоторые измерения каждого объекта на изображении, и получаю эту ошибку:

Error using dip_measure
DIPlib Error in function dip_Measure.
DIPlib Error in function dip_ImageCheck: Data type not supported


Error in measure (line 209)
data = dip_measure(object_in,gray_in,measurementID,objectIDs,connectivity);

Error in Untitled (line 13)
msr = measure(b, [], ({'size', 'perimeter','podczeckShapes'}))

Как я могу ее решить?

Код:

Image = rgb2gray(imread('pillsetc.png'));

BW = imbinarize(Image);
BW = imfill(BW,'holes');
imshow(BW);

[B,L] = bwboundaries(BW,'noholes');
k = 1;
b = B{k};
y  = b(:,2);
x  = b(:,1);

msr(k) = measure(BW, [], ({'size', 'perimeter','podczeckShapes'}))
sz = msr.size;
podczeckShapes = podczeckShapes;

1 Ответ

1 голос
/ 12 апреля 2020

Одной из проблем с вашим кодом является звонок на 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
...