2017-02-22 106 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,[]); 

我的挑戰是理順實體(whitePixels)的邊緣或所有對象的邊緣。我不知道如何做到這一點。我嘗試了過濾,但只是取消了小點。 請大家非常感謝任何幫助,想法或建議或建議。謝謝。

+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

希望這有助於。

編輯:而不是矩形的過濾器,你也可以使用高斯一個。但應用多次的總體思路依然存在。您可以使用f=fspecial('gaussian',5,6)創建一個高斯濾波器,用於創建sigma = 6的5x5濾波器。

+0

我確實認識到** **燒杯**指出,這將不再是一個索引圖像,雖然中值過濾器我沒有得到邊緣平滑,但標籤仍然存在,左下角的一些小點角也被刪除。儘管如此,非常感謝這個建議,我從中學到了一些東西,特別是因爲我可以使用生成的圖像進行可視化。 – User2201

+0

@ User2201那麼,中值濾鏡並不是爲了平滑圖片。中值濾波器旨在消除所謂的鹽和胡椒噪聲。即使多次應用它也不會平滑圖像的邊緣,這實際上是它的好處。 很高興我能幫忙,祝你的項目順利。 – Max

+0

非常感謝@Max – User2201