2014-10-09 2 views
2

Можете ли вы, ребята, предложить возможные способы удаления контура круга на этом изображении? Imfindcircles не работает для меня. Можете ли вы предложить другие методы? http://i.stack.imgur.com/RuD7v.jpgКак удалить круг на этом изображении?

enter image description here

+2

10 использование серого цвета для разделения фона с переднего плана. сделать маску с этим порогом, например, фон имеет 1. расширите фон, используя imdilate, и примените к вашему двоичному изображению. – ASantosRibeiro

+0

Сэр Я не получаю ту часть, где вам нужно расширить фон и применить его к своему изображению. Можете ли вы подробнее рассказать об этом? Извините – Jamesmeister

ответ

2

Предполагая 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.

+0

сэр, когда я делаю то, что вы говорите, он не работает на других изображениях, где есть кровеносные сосуды, соединенные с кругом. – Jamesmeister

+0

@Jamesmeister Свяжите нас с таким делом? – Divakar

1

ОК, так что здесь есть одна гипотеза, которая не предполагает, что интерфейс должен быть кругом, ни быть ни одной областью, ни иметь самый большой периметр.

%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; 
+0

Я преобразовал исходное изображение в оттенки серого сначала перед тем, как сделать часть thres. mask_A показывает только чистый белый фон. Поэтому, после умножения на bin_A, результат был таким же с правильным изображением. – Jamesmeister

+0

смотрите исправление. функция graythresh дает нормированную интенсивность, а не правильную. вероятно, поэтому он не работал. – ASantosRibeiro