Ошибка при расчете края изображения

Я пытаюсь извлечь край из изображения. Я использовал следующий алгоритм. Также дается входное изображение (e11), которое представляет собой изображение в оттенках серого 512 * 512.

  1. Найти морфологический градиент входного изображения (градиентим)
  2. Найти негативное изображение градиентного изображения (негатива)
  3. Вычтите исходное изображение из закрытого изображения, используя преобразования нижнего колонтитула (bottomhatim).
  4. Вычислить средний пиксель входного изображения (AVG)
  5. Найдите двоичное изображение на основе AVG, чтобы сгладить изображение.
  6. Найдите самую большую соединенную область, чтобы найти более крупные объекты (CC).
  7. Вычесть самый большой регион из сглаженного изображения (края).

Код Matlab, который я написал, приведен ниже

e11 = imread("lena.jpg");
e11= double(e11);
gradientim = imdilate(e11,se) - imerode(e11,se);
negativeim = imcomplement(gradientim);
bottomhatim = imclose(negativeim,se) -  e11 ;
AVG = mean2(e11);
%-------Computing binary image--------
for i=1:(height)
     for j=1:(width)
         if(AVG > bottomhatim(i,j,:))
              bottomhatim(i,j,:) = 1;
         else
              bottomhatim(i,j,:) = 0;
         end
     end
end
CC = bwconncomp(bottomhatim);
edge = bottomhatim - CC;

При выполнении шага 7, поскольку тип подключенного компонента (CC) - "struct", я получаю сообщение об ошибке следующим образом

Msgstr "Неопределенная функция" минус "для входных аргументов типа" структура "".

Можно ли использовать функцию "bwconncomp", чтобы найти самую большую подключенную область? Есть ли какая-либо альтернативная функция для этого? Пожалуйста, помогите мне исправить этот код. Спасибо заранее.

1 ответ

Решение

Вы предполагаете CC это массив, но на самом деле это структура. Именно об этом говорят доктора. bwconncomp:

 bwconncomp Find connected components in binary image.
    CC = bwconncomp(BW) returns the connected components CC found in BW. 
    BW is a binary image that can have any dimension. CC is a structure 
    with four fields:

       Connectivity   Connectivity of the connected components (objects).

       ImageSize      Size of BW.

       NumObjects     Number of connected components (objects) in BW.

       PixelIdxList   1-by-NumObjects cell array where the kth element
                      in the cell array is a vector containing the linear
                      indices of the pixels in the kth object.

По описанию вашего алгоритма вы хотите найти самый большой связанный компонент и вычесть его из вашего изображения, чтобы получить окончательное изображение, сохраненное в edge, Я рекомендую вам использовать bwlabel вместо этого, которая возвращает карту меток, которая маркирует каждый отдельный объект с уникальным идентификатором. Второй вывод bwlabel возвращает, сколько объектов было обнаружено.

я хотел бы использовать bwlabel, в сочетании с histc подсчитать, сколько пикселей принадлежало каждой области. Мы бы использовали это, чтобы определить регион, который имеет наибольшую площадь. Затем вы сделали бы маску, состоящую из этого объекта, затем использовали ее и вычли из вашего изображения, чтобы получить окончательный результат edge,

В частности, сделайте это в конце вашего кода:

%// Do bwlabel on image
[L, num] = bwlabel(bottomhatim);

%// Count how many values belong to each object, ignoring background
counts = histc(L(:), 1:num);

%// Find which object gives us the largest area
[~,max_id] = max(counts);

%// Make a mask and then subtract
CC = L == max_id;
edge = imsubtract(bottomhatim, CC);