Можете ли вы, ребята, предложить возможные способы удаления контура круга на этом изображении? Imfindcircles не работает для меня. Можете ли вы предложить другие методы? http://i.stack.imgur.com/RuD7v.jpgКак удалить круг на этом изображении?
ответ
Предполагая BW
быть бинарное изображение, которое имеет контур кружил и который должен быть удален, вы можете использовать подход, основанный на regionprops
-
perimtrs = regionprops(BW, 'Perimeter'); %// perimeters for each connected component
px = regionprops(BW, 'PixelIdxList'); %// pixel list for each connected component
[~,idx] = max(struct2array(perimtrs)); %// get the component with max perimeter
%// that represents the outline circle
BW(px(idx).PixelIdxList) = 0; %// Set all pixels of the outline circle to zero,
%// that is they are removed
Если вы хотели бы быть на самой безопасной стороне с функциональностью, вы можете использовать BoundingBox
свойства от regionprops
вместо 'Perimeter'
, как показано здесь -
%// Get the bounding box properties for each connected component
perimtrs = regionprops(BW, 'BoundingBox');
%// Get bounding box area for each component and get the ID for the largest
%// box that corresponds to the outline circle
bound_box = reshape(struct2array(perimtrs),4,[]);
bound_box_area = bound_box(3,:).*bound_box(4,:);
[~,idx] = max(bound_box_area);
%// Set the pixels corresponding to the outline circle to zeros
px = regionprops(BW, 'PixelIdxList');
BW(px(idx).PixelIdxList) = 0;
В качестве альтернативы, вы можете избежать второго использования regionprops
, чтобы получить список пикселей, с вызовом regionprops
и что может быть эффективным с производительностью, но я не не проверял, поэтому не может гарантировать, что , Новый подход будет выглядеть примерно так -
perimtrs = regionprops(BW, 'Perimeter');
[~,idx] = max(struct2array(perimtrs))
[L,num] = bwlabel(BW); %// Label connected components
BW(L==idx)=0; %// Select all pixels corresponding to label idx and set those to zero
Кроме того, вы можете смешать этот bwlabel
подход с BoundingBox
из regionprops
.
сэр, когда я делаю то, что вы говорите, он не работает на других изображениях, где есть кровеносные сосуды, соединенные с кругом. – Jamesmeister
@Jamesmeister Свяжите нас с таким делом? – Divakar
ОК, так что здесь есть одна гипотеза, которая не предполагает, что интерфейс должен быть кругом, ни быть ни одной областью, ни иметь самый большой периметр.
%Assume A as your original image (left image), and bin_A as your binary image (right image)
thres=graythresh(A)
mask_A=im2bw(A,thres);
mask_A=imerode(mask_A,ones(3));
bin_A=bin_A.*mask_A;
Я преобразовал исходное изображение в оттенки серого сначала перед тем, как сделать часть thres. mask_A показывает только чистый белый фон. Поэтому, после умножения на bin_A, результат был таким же с правильным изображением. – Jamesmeister
смотрите исправление. функция graythresh дает нормированную интенсивность, а не правильную. вероятно, поэтому он не работал. – ASantosRibeiro
10 использование серого цвета для разделения фона с переднего плана. сделать маску с этим порогом, например, фон имеет 1. расширите фон, используя imdilate, и примените к вашему двоичному изображению. – ASantosRibeiro
Сэр Я не получаю ту часть, где вам нужно расширить фон и применить его к своему изображению. Можете ли вы подробнее рассказать об этом? Извините – Jamesmeister