VapourSynth常用插件——KNLMeans Opencl实现的非局部降噪

文章目录[x]
  1. 1:前言
  2. 2:插件简介
  3. 3:插件下载
  4. 4:使用方法

大家好,我是Ace,这篇文章介绍VapourSynth常用插件——KNLMeans,希望大家能够喜欢。

前言

为了这个插件教程,为了大家能够理解nlmeans的原理,我写了四篇图像处理相关的文章,分别是:

图像处理——卷积

图像处理——模糊

图像处理——降噪原理分析

图像处理——NL-Means

大家可以根据自己的基础选择性查看。

NL-Means算法的原理已经在图像处理——NL-Means篇中写过了,这篇文章就主要讲插件的使用。

插件简介

为什么要讲这个降噪插件?不讲其他的?

首先,该降噪插件是具有保留边缘效果的降噪滤波器,其次,该降噪插件使用opencl实现,意味着你可以使用显卡来进行运算,这将充分利用显卡的运算资源,减少CPU的压力。

下面附上官方的wiki链接:

Home · Khanattila/KNLMeansCL Wiki

插件下载

请查看VapourSynth教程的《VapourSynth 插件介绍及常用插件下载》篇,里面的插件包带有该插件。

也可以到官方的Github主页下载

使用方法

示例代码:

import vapoursynth as vs
from vapoursynth import core

# 写上你想要读取的视频的路径(绝对路径和相对路径都可以)
file_path = "00002.m2ts"

# 读取视频
src = core.lsmas.LWLibavSource(file_path, threads=1)

denoise = core.knlm.KNLMeansCL(
        src,
        # 时域半径
        d=1,
        # 空间域降噪区域半径
        a=3,
        # 比较相似度时选取的邻域半径
        s=2,
        # 降噪力度
        h=2,
        channels="Y",
        wmode=3,
        device_type="GPU",
        device_id=0,
        info=False
    )

interleave = core.std.Interleave(
    clips=[src, denoise]
)

# 输出视频
interleave.set_output()

这次的脚本调用了两个函数,我们一个一个讲解。

首先是KNLMeansCL函数,该函数即为对视频帧进行nlmeans降噪。

根据官方文档

第一个参数clip为输入视频,

第二个参数d为时域的半径,默认值为1,由于视频帧是由多个图像帧组成的,并且前后帧的同一个位置大概率变化不大,该参数如果大于1,可以使用其他帧参与降噪时的运算。如果该参数为0,只用本帧进行运算。如果为1,使用前后帧+本帧运算,以此类推。

该参数越大,运算越慢。

第三个参数a为空间域降噪区域的半径,默认值为2,即为图像处理——NL-Means篇教程中所述的图像降噪区域的半径。

该参数越大,运算越慢。

第四个参数s为计算像素相似性的邻域半径,默认值为4,在图像处理——NL-Means篇教程也有涉及。

第五个参数h为降噪力度,默认值1.2,在图像处理——NL-Means篇教程也有涉及。

参数channels为进行降噪的通道,如果输入的视频为YUV的,那么默认只对Y平面降噪,如果输入视频为RGB的,默认三通道均降噪。

参数wmode的具体含义请参考官方文档。

参数device_type指定使用CPU或者是GPU。

参数device_id指定你需要使用的设备在opencl中的id号。

那么不知道它读到的id号怎么办呢?

参数info为True的时候,会在输出的视频帧中写上它读取到的opencl的设备号,通过它来指定就可以了。当然这个正式压制的视频别开。

其次是Interleave函数,是VapourSynth内置的函数,这是在对比效果时必用的函数,作用是将两个视频每一帧交错排列后输出,一般把前面的作为源视频,后面的作为处理后的视频,这样可以直接在vsedit的预览栏中通过左右切换,直观地对比处理效果。

那我们直接来对比一下降噪的效果:

源视频:

降噪后:

可以发现,噪点基本都被去除了,图像的边缘也基本上没有太大变化。

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

20 + 7 =