- 1:前言
- 2:插件简介
- 3:插件下载
- 4:使用方法
前言
为了这个插件教程,为了大家能够理解nlmeans的原理,我写了四篇图像处理相关的文章,分别是:
大家可以根据自己的基础选择性查看。
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的预览栏中通过左右切换,直观地对比处理效果。
那我们直接来对比一下降噪的效果:
源视频:
降噪后:
可以发现,噪点基本都被去除了,图像的边缘也基本上没有太大变化。