1

我有 Java 代码,它采用卷积矩阵(只是 2D double[][])并将其应用于图像。我试图弄清楚如何创建一个矩阵,该矩阵将给出运动模糊,给定一个角度(以度为单位)和一个模糊幅度。

幅度 = 1 的模糊示例矩阵(中间像素在每个方向上模糊一个像素),45 度运动模糊为:

0      0    1/3
0     1/3    0
1/3    0     0

幅度决定了矩阵的大小(大小 = 2*幅度 + 1),并且单行单元格在运动方向上是非零的。

我遇到的问题是在给定角度的情况下确定矩阵中哪些单元格非零所需的数学/代码。

伪(或实际)代码将非常有帮助!

4

2 回答 2

1

对于运动模糊,非零元素都显示在一条线上。这就是您的示例有效的原因。[1/n 1/n (ntimes)... 1/n] 会在水平方向模糊,而转置会在垂直方向模糊。对于任意角度,只需填写最接近所需角度的线的非零元素。

编辑。

例如,您可能会尝试最小化像素索引的某些函数以确定该像素是否应为非零。|(i - 3*j)| < 小数,将沿着斜率 3 的线找到像素。

于 2013-03-22T21:09:59.160 回答
1

在 Matlab 和 Octave 中,有一个名为“fspecial”的内置函数用于创建卷积核。通过传递“运动”标志以及幅度和角度,它将输出一个构成内核(矩阵),您可以使用该内核将运动模糊应用于图像。https://octave.sourceforge.io/image/function/fspecial.html

不幸的是,在其他语言中似乎没有这样的功能,无论如何我都可以找到用于创建此内核的功能。我能想到的最好的方法是将角度和幅度转换为一条线的起点和终点 (x,y) 点。然后你可以使用 Xiaolin Wu 算法绘制一条灰度抗锯齿线https://rosettacode.org/wiki/Xiaolin_Wu%27s_line_algorithm

您必须将所有元素除以元素之和,以确保在将内核与图像进行卷积之前对其进行规范化。

于 2020-07-10T16:03:19.580 回答