0

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

  1. Найти морфологический градиент входного изображения (gradientim)
  2. Найти негативное изображение градиента изображения (negativeim)
  3. Subtract исходное изображение из закрытого изображения, используя снизу шлема преобразования (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; 

enter image description here

Делая шаг 7, Поскольку тип подключенного компонента (CC) является 'структура', I» m получает ошибку следующим образом:

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

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

ответ

2

Вы принимаете 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); 
+1

Сво работает правильно now.Thanks – Celine

Смежные вопросы