我有一个Java代码,它采用卷积矩阵(只是一个2D double[][]
)并将其应用于图像。我正试图找出如何创建一个矩阵,将给出一个运动模糊,给定的角度(度)和一个大小的模糊。
一个大小为1的模糊矩阵示例(中间像素在每个方向上被模糊一个像素),45度运动模糊为:
0 0 1/3
0 1/3 0
1/3 0 0
大小决定矩阵的大小(大小= 2*大小+ 1),单行细胞在运动方向上不为零。
我遇到的问题是计算出给定角度的矩阵中哪些单元格是非零的数学/代码。
伪(或实际)代码将非常有帮助!
对于动态模糊,非零元素显示全部位于一条直线上。这就是为什么你的例子有效。[1/n 1/n (n次)…]1/n]会在水平方向模糊,而转置会在垂直方向模糊。对于任意角度,只需填入最接近你想要的角度的直线的非零元素。
编辑。
例如,您可以尝试最小化像素索引的某些函数,以确定该像素是否应该为非零。|(i - 3*j)| <较小的数字,会沿着斜率为3的直线找到像素。>
在Matlab和Octave中,有一个内置函数名为"fspecial"用来创建卷积的核。通过传递"运动"标志以及幅度和角度,它将输出一个宪法内核(矩阵),您可以使用它对图像应用运动模糊。https://octave.sourceforge.io/image/function/fspecial.html
不幸的是,在其他语言中似乎没有这样的函数,我可以找到创建这个内核的方法。我能想到的最好的方法是将角度和大小转换成直线的起始点和结束点(x,y)。然后你可以用吴晓林算法画一条灰度的、抗锯齿的线https://rosettacode.org/wiki/Xiaolin_Wu%27s_line_algorithm
您必须将所有元素除以元素的和,以确保内核在与图像卷积之前被归一化。