给定角度和幅度的运动模糊卷积矩阵

时间:2013-03-22 20:57:55

标签: java image-processing matrix convolution motion-blur

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

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

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

幅度决定了矩阵的大小(大小= 2 *幅度+ 1),单个细胞系在运动方向上不为零。

我遇到的问题是必要的数学/代码,以确定在给定角度的矩阵中哪些单元格具有非零值。

伪(或实际)代码会非常有用!

2 个答案:

答案 0 :(得分:1)

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

编辑。

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

答案 1 :(得分:0)

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

不幸的是,在其他语言中似乎没有这样的功能,我仍然可以找到创建该内核的功能。我能想到的最好的方法是将角度和大小转换为直线的起点和终点(x,y)。然后,您可以使用Xiaolin Wu算法https://rosettacode.org/wiki/Xiaolin_Wu%27s_line_algorithm

绘制灰度,抗锯齿的线条

您必须将所有元素除以这些元素的总和,以确保在将内核与图像进行卷积之前将其标准化。