image - 如何在Matlab中对图像的某个特定方向进行模糊处理?

标签 image matlab filter blur

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

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

这里有一个例子:

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

enter image description here

然而,模糊的图片是在两个方向上模糊的!在本例中为 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,[]);

Add image output

更新代码:这将对 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/

相关文章:

c# - 在 ASP.NET 中发送带有嵌入图像的邮件

javascript - 我怎样才能一个接一个地加载图像?

arrays - 随机数对 Matlab

matlab - 尝试基于现有函数创建符号函数时出现"Unable to prove literally"错误

matlab - 使用matlab求拉普拉斯变换

jquery - 如何在过渡期间过滤选项而不让所有内容重新出现?

date - tibco Spotfire 默认情况下将过滤器设置为持续 8 天

Delphi - 显示所有图像格式

css - webkit:按比例调整图像大小

JavaScript 通过嵌套数组过滤对象数组并检查嵌套数组内的变量匹配