3

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

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

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

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

编辑:

视频处理的过滤算法*

4

2 回答 2

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 );

 }

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

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

于 2012-05-17T17:38:55.733 回答
3

您应用图像扭曲。基本上对于转换后的输出图像中的每个点,您都有一个数学公式来计算该点在原始图像中的来源,然后您只需复制这些坐标处的像素 - opencv 具有执行此操作的功能。

通常,您当然会尝试消除像鱼眼这样的光学效果,但原理是一样的。

附言。考虑从结果开始并返回源有点令人困惑,但您这样做是因为源图像中的许多点可能都到结果中的同一点,并且您想要结果像素的均匀网格。

于 2012-05-17T14:32:46.100 回答