我有一张图像,我想使用 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" kernel 。我不确定“运动”模糊使用什么内核,但根据您提供的图像,我猜测它是对称的。
这里有一些代码可以在一个方向上应用 cometd 内核。如果你想要任意角度,你就必须改变周围的东西。您可以从输出中看到它在一个方向上涂抹,因为仅一侧有一条黑带(由于那里缺少像素)。
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,[]);
更新代码:这将对 cometd 内核应用任意旋转。另请注意前面示例中的 sigma 与此处的 sx 和 sy 之间的区别,它们控制内核的长度和宽度参数,如建议的那样安德拉斯在评论中。
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,[]);
关于image - 如何在Matlab中对图像的某个特定方向进行模糊处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57326712/