我可以使用什么算法在图像上应用鱼眼失真?

Pav*_*van 3 algorithm video-processing filter

任何人都可以指导我开发视频处理过滤算法的最佳方法吗?

比方说,我想在图像上应用鱼眼镜头滤镜,我如何处理像素,以便模仿这种效果?

如果我想让图片看起来更红,那么我会从每个像素的蓝色和绿色成分中扣除值,只留下红色成分.

这种失真不仅仅是色彩处理,所以我想知道如何以正确的方式操纵像素来模仿鱼眼镜头滤镜,或者说是捏合滤镜,等等.

编辑:

视频处理的过滤算法*

Bra*_*son 5

正如Martin所说,要对图像应用失真,而不仅仅是颜色校正,您需要以某种方式取代该图像中的像素.您通常从输出图像开始,并确定要从哪个输入像素位置获取以填充输出中的每个位置.

例如,为了生成我在这个答案中显示的捏合失真,我使用一个OpenGL ES片段着色器,如下所示:

 varying highp vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;

 uniform highp vec2 center;
 uniform highp float radius;
 uniform highp float scale;

 void main()
 {
     highp vec2 textureCoordinateToUse = textureCoordinate;
     highp float dist = distance(center, textureCoordinate);
     textureCoordinateToUse -= center;
     if (dist < radius)
     {
         highp float percent = 1.0 + ((0.5 - dist) / 0.5) * scale;

         textureCoordinateToUse = textureCoordinateToUse * percent;
     }
     textureCoordinateToUse += center;

     gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse );

 }
Run Code Online (Sandbox Code Playgroud)

此GLSL代码应用于输出图像中的每个像素.它的作用是计算从被挤压区域的中心到当前像素坐标的距离.然后它接受输入距离并根据输入scale参数进行缩放.这个新的缩放距离用于替换输入图像中将从中读取输出颜色的坐标.

对于每个输出像素,在移位坐标处从输入图像采样颜色是产生输入图像的失真版本的原因.正如您在我的链接答案中所看到的,计算此位移的略微不同的函数可能导致非常不同的失真.