繁体   English   中英

如何在Matlab中沿特定方向模糊图像?

[英]How to blur an image in one specific direction in Matlab?

我有一张图像,我想使用Matlab在一个特定的方向和距离上使其模糊。

我发现有一个名为fspecial('motion',len,theta)的过滤器。

这里有一个例子:

I = imread('cameraman.tif');
imshow(I);
H = fspecial('motion',20,45);
MotionBlur = imfilter(I,H,'replicate');
imshow(MotionBlur);

在此处输入图片说明

但是,模糊的图片在两个方向上都是模糊的! 在这种情况下为225度和45度。 为了仅在特定方向(例如45)而不是同时在两个方向上模糊它,应该怎么做?

我认为您需要所谓的“ comet”内核 我不确定用于“运动”模糊的内核是什么,但是我猜它基于您提供的图像是对称的。

这是一些将彗星内核应用到一个方向的代码。 如果要任意角度,则必须改变周围的事物。 从输出中您可以看到它在一个方向上拖尾,因为仅在一侧有一个黑带(由于那里没有像素)。

L = 5; % kernel width
sigma=0.2; % kernel smoothness

I = imread('cameraman.tif');
x = -L:1.0:L;

[X,Y] = meshgrid(x,x);
H1 = exp((-sigma.*X.^2)+(-sigma.*Y.^2));
kernel = H1/sum((H1(:)));

Hflag = double((X>0));
comet_kernel = Hflag.*H1;
comet_kernel=comet_kernel/sum(comet_kernel(:));

smearedImage = conv2(double(I),comet_kernel,'same');

imshow(smearedImage,[]);

添加图像输出

更新的代码 :这将对彗星内核进行任意旋转。 还要注意前面示例中的sigma与此处的sxsy之间的区别,它们控制内核的长度和宽度参数,正如Andras在评论中所建议的那样。

L = 5; % kernel width
sx=3;
sy=10;
theta=0;

I = imread('cameraman.tif');
x = -L:1.0:L;

[X,Y] = meshgrid(x,x);
rX = X.*cos(theta)-Y.*sin(theta);
rY = X.*sin(theta)+Y.*cos(theta);
H1 = exp(-((rX./sx).^2)-((rY./sy).^2));
Hflag = double((0.*rX+rY)>0);
H1 = H1.*Hflag;
comet_kernel = H1/sum((H1(:)))

smearedImage = conv2(double(I),comet_kernel,'same');

imshow(smearedImage,[]);

基于Anger Density的回答,我编写了这段代码,完全解决了我的问题:

L = 10; % kernel width
sx=0.1;
sy=100;
THETA = ([0,45,90,135,180,225,270,320,360])*pi/180;
for i=1:length(THETA)

    theta=(THETA(i)+pi)*-1;

    I = imread('cameraman.tif');
    x = -L:1.0:L;

    [X,Y] = meshgrid(x,x);
    rX = X.*cos(theta)-Y.*sin(theta);
    rY = X.*sin(theta)+Y.*cos(theta);
    H1 = exp(-((rX./sx).^2)-((rY./sy).^2));
    Hflag = double((0.*rX+rY)>0);
    H1 = H1.*Hflag;
    comet_kernel = H1/sum((H1(:)));

    smearedImage = conv2(double(I),comet_kernel,'same');

     % Fix edges
    smearedImage(:,[1:L, end-L:end]) = I(:,[1:L, end-L:end]); % Left/Right edge
    smearedImage([1:L, end-L:end], :) = I([1:L, end-L:end], :); % Top/bottom edge

    % Keep only inner blur
    smearedImage(L:end-L,L:end-L) = min(smearedImage(L:end-L,L:end-L),double(I(L:end-L,L:end-L)));


    figure
    imshow(smearedImage,[]);
    title(num2str(THETA(i)*180/pi))
    set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM