如何使用matlab来平滑图片的边缘

时间:2013-12-10 14:10:05

标签: matlab image-processing

enter image description here我在下面看到一张照片,但照片边缘非常难看。 我想使用matlab编程来平滑图片的边缘并使其看起来更漂亮,任何想法或方法都有意义吗?

谢谢!!!

3 个答案:

答案 0 :(得分:6)

这是一个选项(已编辑):

I = im2double(imread('ht4Za.jpg'));
% Segment the object:
gs = rgb2gray(I);
Object=~im2bw(gs, graythresh(gs));

% Smoothen the mask:
BW = bwmorph(bwconvhull(Object), 'erode', 5);
Mask=repmat(BW,[1,1,3]);

% Iterate opening operation:
Interp=I;
for k=1:5
    Interp=imopen(Interp, strel('disk',20));
end

% Keep original pixels, add the newly generated ones and smooth the output:
Interpolated(:,:,1)=medfilt2(imadd(I(:,:,1).*Object, Interp(:,:,1).*~(BW==Object)), [4 4]);
Interpolated(:,:,2)=medfilt2(imadd(I(:,:,2).*Object, Interp(:,:,2).*~(BW==Object)), [4 4]);
Interpolated(:,:,3)=medfilt2(imadd(I(:,:,3).*Object, Interp(:,:,3).*~(BW==Object)), [4 4]);

% Display the results:
Masked=imadd(Interpolated.*im2double(Mask), im2double(~Mask));
imshow(Masked);

结果:

enter image description here

这有点粗糙,但那会给你一个开始。您可以尝试调整迭代次数以及圆形滤波器和中值滤波器的大小。尝试用平均值等改变中位数

答案 1 :(得分:4)

您可以使用imopen在形态上打开RGB图像(扩张和侵蚀)。 imopen函数的第二个输入参数是一个结构元素,它定义了形态学操作中所需的平滑量。例如,下面是我应用半径为10的磁盘结构元素的代码。

img = imread('http://i.stack.imgur.com/ht4Za.jpg');
imopenBW = imopen(img, strel('disk',10));
imshow(imopenBW)

答案 2 :(得分:0)

您可以使用isocontour [1]边缘检测,然后沿轮廓平均相邻像素,以平滑边界。

[1] http://www.mathworks.com/matlabcentral/fileexchange/30525-isocontour