Ошибка при расчете края изображения
Я пытаюсь извлечь край из изображения. Я использовал следующий алгоритм. Также дается входное изображение (e11), которое представляет собой изображение в оттенках серого 512 * 512.
- Найти морфологический градиент входного изображения (градиентим)
- Найти негативное изображение градиентного изображения (негатива)
- Вычтите исходное изображение из закрытого изображения, используя преобразования нижнего колонтитула (bottomhatim).
- Вычислить средний пиксель входного изображения (AVG)
- Найдите двоичное изображение на основе AVG, чтобы сгладить изображение.
- Найдите самую большую соединенную область, чтобы найти более крупные объекты (CC).
- Вычесть самый большой регион из сглаженного изображения (края).
Код 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);