我正在尝试使用 FFmpeg 创建桶形失真效果。lenscorrection
滤镜可以做到这一点,但根据源材料的不同,结果可能非常糟糕,会出现莫尔条纹/插值不佳。
源图像
FFmpeg 的结果
(使用-vf lenscorrection=k1=0.1:k2=0.1
:):此处的莫尔条纹干扰非常严重。我猜想镜头校正滤镜使用了最近邻插值,而这似乎无法配置。
我从 ImageMagick 和 Photoshop 中都获得了更好的结果,这里有一个 Photoshop 示例用于比较。
对于单个图像来说,这很好,但我需要一种方法来使用 FFmpeg 对视频执行此操作。
有没有更好的方法?有什么建议吗?
编辑,遵循评论:至少有两种方法可以改善 FFmpeg 的结果,但它们对于实际使用来说并不适用,因为它们具有大致相同的(大)缺点:
提升图像质量在将其输入镜头校正之前将其放大一个很大的倍数,然后将其缩小。这有效地消除了莫尔条纹,如果我添加一点高斯模糊作为低通滤波器,效果会更好。例如:
ffmpeg -i in.png -vf "scale=iw*8:ih*8:flags=neighbor, lenscorrection=k1=.1:k2=.1, gblur=9:1:15:2, scale=iw/8:ih/8:flags=lanczos" out.png
缺点:缩放因子越大,效果越好;在 8 倍时看起来还可以接受,但对于大型视频,由于极端的 CPU/内存开销,这些缩放因子几乎不实用。使用v360过滤器确实支持更好的插值方法(默认为双线性)。例如:
ffmpeg -i 1s.png -vf v360=flat:fisheye:ih_fov=60:v_fov=45:h_fov=60:v_fov=45:w=360:h=240 out.png
-
缺点:我找不到一种直观的方式来控制数量失真。可以通过填充框架来减少失真,这样图像占据其面积的比例就会更小(=相当于将“镜头”移得更远)。但是,对于较小的失真,框架尺寸很快就会变得难以管理 - 与方法 #1 的问题相同。
因此,如果存在更好的解决方案,我仍在寻找它。
答案1
由 Paul B. Mahol 于 1 月 25 日添加的内容修复。现在可以指定双线性插值进行镜头校正,这很好地解决了莫尔条纹问题。例如:lenscorrection=k1=.1:k2=.1:i=bilinear