2017-02-22 77 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