2017-02-22 14 views
0

У меня есть изображение, в котором я хотел бы сгладить его края. Было немного сложно получить более точную сегментацию. Однако я получил решение, адаптировав предложение от: What can I do to enhance my image quality?.Как сгладить края многокомпонентного изображения?

оригинальных изображений здесь: Original image

и сегментированного изображения, а также Segmented image

Код я использовал это следующим образом:

%# Read in image 
Img = imread('image_name.png'); 

%# Apply filter 
h = fspecial('average'); 
Img = imfilter(Img, h); 

%# Segment image 
Img = rgb2gray(Img); 
thresh = multithresh(Img, 2); 
Iseg = imquantize(Img, thresh);  
figure, imshow(Iseg,[]), title('Segmented Image'); 

%# separate channels 
blackPixels = (Iseg == 1); 
grayPixels = (Iseg == 2); 
whitePixels = (Iseg == 3); 


%# grow white channel 
whitePixels_dilated = imdilate(whitePixels, strel('disk', 4, 4)); 

%# Add all channels 
Iseg(whitePixels | whitePixels_dilated) = 3;    
figure, imshow(Iseg,[]); 

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

+0

Какую фильтрацию вы попробовали? – Max

+0

Если вы сглаживаете края, это больше не будет сегментированным (индексированным) изображением. Это то, что вы хотите? – beaker

+0

@ user2201 Возможно, вместо сглаживания краев вы должны попытаться применить алгоритм установки окружности на индексированном изображении. Чем вы можете нарисовать круги, найденные вами по индексированному изображению, с более толстой «LineWidth», и вы получите более четкие контуры в ваших кругах. А затем - в зависимости от точности, в которой вы нуждаетесь, вы можете индексировать пиксели, установленные в круг, как внутри, так и вне сегмента. – Max

ответ

0

Я предлагаю применять прямоугольный фильтр несколько раз. Вот подход о том, как это сделать:

I=imread('Orl1r.png'); 
I_gray=rgb2gray(I); 
I_filtered=I_gray; % initialize the filtered image 
for ii=1:10 
    I_filtered=imfilter(I_filtered,1/25*ones(5)); % apply rectangular-filter multiple times 
end 
figure 
subplot(1,2,1) 
imshow(I,[0 255]); 
subplot(1,2,2); 
imshow(I_filtered,[0 255]) 

Вот что отфильтрованное изображение будет выглядеть так: enter image description here

Надеется, что это помогает.

EDIT: вместо прямоугольного фильтра вы также можете использовать гауссовский. Но общая идея применения нескольких времен сохраняется. Вы можете создать фильтр Гаусса для exapmle, используя f=fspecial('gaussian',5,6), который создает маску фильтра 5x5 с сигма = 6.

+0

Я понимаю, что ** beaker ** указал, что это больше не будет индексированным изображением, хотя со срединным фильтром я не получаю сглаженные края, но метки остаются, а некоторые из маленьких пятен внизу слева угол также удаляется. Тем не менее, большое спасибо за это предложение, я узнал что-то от него, тем более, что я мог использовать полученный образ для целей визуализации. – User2201

+0

@ User2201 Ну, медианный фильтр не предназначен для сглаживания изображений. Медианный фильтр предназначен для удаления так называемого солевого и пикового шума. Даже применение его несколько раз не сглаживало края изображения, что на самом деле хорошо. Рад, что я мог бы помочь в любом случае и удачи в вашем проекте. – Max

+0

Большое спасибо @Max – User2201

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