分页: 1 / 3

Contra-Sharpen mod 3.7 | CSmod16 1.6 —— EP锐化/还原用脚本,增加16bit版

发表于 : 2012-06-26 22:46
mawen1250
CSmod 3.7 + CSmod16 1.6
NMM碗柜
► 显示剧情透露 CSmod 3.4 + CSmod16 1.3
我的所有avsi脚本所需滤镜(Requirements)打包下载:http://pan.baidu.com/s/1Bt2fY

因为是随便搞出来给自己用的,所以也没有写什么完整的说明文档,avsi打开里面会有一些详细的英文注释。
第二页有更新日志。

Contra-Sharpen的基本原理就是,如果有一个源视频clip source,对其进行如降噪、AA、Dehalo等处理后得到clip filtered,这些处理导致视频中细节损失、边缘变模糊,于是通过unsharp的方式对filtered进行锐化(对画面做模糊处理前后的差值再加回源视频就是锐化)。但同时通过sourcefiltered的差值对这个锐化的差值进行限制(使用Repair的方式),于是能将画面的锐度还原到和source类似的程度但又不超过source,能还原不少的细节。
我这个CSmod里还加入了可以在还原基础上进一步锐化超过source的功能,所以有更好的通用性与效率(原来我想实现这种效果就要用2个LSFmod像是filtered.LSFmod(source=source).LSFmod())。


2012.9.3添加16bit版本,内部全程16bit处理(除了当ss_hq=true时用的nnedi3_rpow2为8bit输入输出,不过我觉得这个没必要所以默认为false),可以减小8bit处理过程rounding error造成的锐化结果不平滑,从实际对比中也能比较明显看得出来区别。更高的处理精度是CSmod16的主要优势,至于是否输入输出16bit对于edge部分并没有那么大区别,对于non-edge部分的话16bit输入输出的意义更大一些(lsb_in和lsb控制输入输出是否为stack 16bit)。
同时thr、thrc、Sovershoot、Sundershoot、Tovershoot、Tundershoot、Soft、strength等参数都改为float,以配合16bit精度(1.0对应16bit下的256)。
另外部分功能未能16bit化于是去除(Soothe)。如果用filter_ss那也是要在16bit下进行处理。

由于内部精度的提升,CSmod16版能将一些CSmod难以增强的细节也增强,相同设置下的锐化强度也明显更高,再加上没有Soothe temporal stabilization,所以对于动画可能会出现一些很细小的锯齿,这时可以选择开启Tlimit=true,让输出的结果更加柔和,时域上也更稳定。



CSmod主要特点以及相比LSFmod的主要区别:
(CSmod16大部分特性和CSmod一致,但个别会有区别而且预设值也有所不同,详细请见avsi脚本中的注释)
► 显示剧情透露 CSmod主要特点
在我电脑上的速度测试结果:
► 显示剧情透露 Sharpener speed test

一些简单的用法示例:

AA的最简单方法:在CSmod内做1.5倍的super sampling并做SangNom式的AA,只处理luma不处理chroma,并且锐化强度不超过输入的clip,使用filter_ss="AA"时CSmod会自动设置preblur=0, Smethod=1, edgemode=1, edgemask=7, Repmode=13。通过增大ss_w和ss_h可以减弱AA强度。
CSmod(chroma=false, ss_w=1.50, ss_h=1.50, thr=0, filter_ss="AA")
在CSmod内做1.5倍的super sampling并做SangNom式的AA,只处理luma不处理chroma,并且锐化强度可以超过输入的clip,至多允许超过2点像素值,使用filter_ss="AA"时CSmod会自动设置preblur=0, Smethod=1, edgemode=1, edgemask=7, Repmode=13。
CSmod(chroma=false, ss_w=1.50, ss_h=1.50, thr=2, filter_ss="AA")
在CSmod内做1.5倍的super sampling并做SangNom式的AA,只处理luma不处理chroma,锐化强度为80,并且锐化强度不受输入的clip限制,而通过Slimit和Tlimit限制。
CSmod(chroma=false, ss_w=1.50, ss_h=1.50, strength=80, limit=false, Slimit=true, Tlimit=true, filter_ss="AA")
用CSmod16做16bit内部精度的luma锐化,用Tlimit进行限制,只处理edge部分,输入输出均为8bit。
CSmod16(lsb_in=false, lsb=false, chroma=false, edgemode=1, Tlimit=true)
用dfttest做luma+chroma的Spatial-Temporal降噪,然后再用CSmod16对flat区域的细节做luma+chroma的锐化,锐化强度不超过原始的画面。不处理edge部分,输入输出均为16bit。
source = last
denoised = source.dfttest(sigma=4.0, sigma2=4.0, lsb_in=true, lsb=true, Y=true, U=true, V=true)
denoised.CSmod16(source, preset="detail", lsb_in=true, lsb=true, chroma=true, mergesrc=true)
功能和上一个例子相同,但这里注意一个语法问题:当没有clip参数输入时函数会自动使用last作为输入clip filtered,而指定clip参数作为输入时则按照clip filtered、clip "source"的顺序依次赋值。
所以如果你想要输入两个clip来使用Contra-Sharpen进行还原,下面的例子中就必须指定两个clip参数last和source,而不能将last省略,否则(只输入一个clip参数source)CSmod16是将其作为clip filtered输入而不是clip "source",那么等于这里的dfttest完全没有起到作用。
source = last
dfttest(sigma=4.0, sigma2=4.0, lsb_in=true, lsb=true, Y=true, U=true, V=true)
#Wrong# CSmod16(source, preset="detail", lsb_in=true, lsb=true, chroma=true, mergesrc=true)
last.CSmod16(source, preset="detail", lsb_in=true, lsb=true, chroma=true, mergesrc=true) #Correct#
用CSmod16做luma的锐化,只处理flat区域不处理edge区域,自动用Tlimit进行锐化限制,用于噪点、细节的增强,调整Tovershoot控制锐化强度。输入输出均为16bit,如果要输入输出8bit则改为lsb_in=false, lsb=false。嫌原盘噪点不够锐利不够有质感、细节糊的同学赶快上吧……
CSmod16(preset="grain", lsb_in=true, lsb=true, chroma=false, Tovershoot=2.0)

Re: 【教程】 MaskTools入門教程

发表于 : 2012-06-26 22:57
4h4h270
拜谢MW菊苣

Re: Contra-Sharpen mod 2.2

发表于 : 2012-06-27 8:08
dgwxx
与主题无关的帖子请单独开帖,防止盖歪楼。

Re: Contra-Sharpen mod 2.2

发表于 : 2012-06-27 9:47
yabbay
支持楼主 最近一直在用SharpAAMCmod
以后有空试试CSmod
另,如果能有SharpAAMCmod的thin参数功能就更好了(貌似是调用awarpshap2来收缩线条的)

Re: Contra-Sharpen mod 2.2

发表于 : 2012-06-27 10:35
mawen1250
yabbay 写了:支持楼主 最近一直在用SharpAAMCmod
以后有空试试CSmod
另,如果能有SharpAAMCmod的thin参数功能就更好了(貌似是调用awarpshap2来收缩线条的)
我这个的核心依然是基于Contra-sharpen的,所以这种额外的处理没有放在里面的必要,应该说和这个脚本没啥关联性。

Re: Contra-Sharpen mod 2.2

发表于 : 2012-06-27 14:16
06_taro
相比2.0確實流程正確了,之前說的大部分問題也都修正了,不過還有些可以修改的。貌似現在不在群裡,所以這裡回复了

代码: 全选

FUNCTION MinBlur(clip clp, int "r", int "uv"){

r      = default(r,1)
uv     = default(uv,3)

uv2    = (uv==2) ? 1  : uv
rg4    = (uv==3) ? 4  : -1
rg11   = (uv==3) ? 11 : -1
rg20   = (uv==3) ? 20 : -1
medf   = (uv==3) ? 1  : -200

RG11D = (r==0) ? mt_makediff(clp,clp.sbr(uv=uv2),U=uv2,V=uv2)
 \    : (r==1) ? mt_makediff(clp,clp.removegrain(11,rg11),U=uv2,V=uv2)
 \    : (r==2) ? mt_makediff(clp,clp.removegrain(11,rg11).removegrain(20,rg20),U=uv2,V=uv2)
 \    :          mt_makediff(clp,clp.removegrain(11,rg11).removegrain(20,rg20).removegrain(20,rg20),U=uv2,V=uv2)
RG4D  = (r<=1) ? mt_makediff(clp,clp.removegrain(4,rg4),U=uv2,V=uv2)
 \    : (r<=2) ? mt_makediff(clp,clp.medianblur(2,2*medf,2*medf),U=uv2,V=uv2)
 \    :          mt_makediff(clp,clp.medianblur(3,3*medf,3*medf),U=uv2,V=uv2)
DD    = mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
clp.mt_makediff(DD,U=uv,V=uv)
return(last)
}
sbr是這樣用的…

mvtools的參數可以增加一個preset,直接用不同的preset來控制不同的強度預設,一個preset參數控制所有的mvtools參數(單獨設置時會被override),這樣就不用在非默認的強度下對每個參數單獨設定了…

MCompensate(original, pMVS, f1v, thSAD=300, thSCD1=300, thSCD2=100)
MCompensate(original, pMVS, b1v, thSAD=300, thSCD1=300, thSCD2=100)
前面thSAD/thSCD1/thSCD2都已經自定義了,這裡為什麼反而固定?
這樣一來前面的設定不是完全沒用了麼

spatial .FluxsmoothT(7)
直接這樣用因為fluxsmoothT的問題有導致blend的隱患
spatial .FluxsmoothT(7).repair(spatial)
至少這樣防範一下

最後,所有參數都沒有assert,函數有多個clip參數的輸入,但是處理前也沒有assert確定是否有問題(分辨率不同之類的),容易出bug

另外之前指出的contra-sharp部分使用Sovershooot/Sundershoot貌似也還沒實現,不知道是為什麼…

Re: Contra-Sharpen mod 2.4

发表于 : 2012-06-27 20:51
mawen1250
多谢taro大,已经更新2.5了……

Re: Contra-Sharpen mod 2.5 —— EP锐化/还原用脚本

发表于 : 2012-06-27 23:30
ikamusume
{:cat_16} 找天空閒的試試看哇

Re: Contra-Sharpen mod 2.6 —— EP锐化/还原用脚本

发表于 : 2012-07-02 22:04
mawen1250
更新2.6。

Re: Contra-Sharpen mod 2.6 —— EP锐化/还原用脚本

发表于 : 2012-07-03 0:23
06_taro
我寫的limit部分是直接在原版contrasharpening上修改的,沒去看在這個mod裡是怎樣,不過肯定不需要這樣:

代码: 全选

ssDD       = limit2 ? ssDD.mt_lutxy(sharpdiff, "x 128 - abs y 128 - abs < x y ?", U=ch31, V=ch31) : ssDD

#sharpening more than source
ssDD       = limit && (Sovershoot >= 1 || Sundershoot >= 1) ? mt_lutxy(ssDD, sharpdiff, "y x - "+string(Sovershoot)+" > x "+string(Sovershoot)+" + x y - "+string(Sundershoot)+" > x "+string(Sundershoot)+" - y ? ?", U=chrepsh? ch31 : ch21, V=chrepsh? ch31 : ch21) : ssDD
首先,第一次其實就是over/undershoot==0的情況,所以兩次lutxy完全可以合併在一起,沒必要多餘地做兩次。順便mt_lut計算數據都是接受float精度的,如果你想考慮16bit的處理,或者考慮以後擴展這個用法時對over/undershoot進行一些高精度的運算(例如乘除乘方開方)的話,這裡over/undershoot最好使用float型變量,實際上因為內部都是float,這裡用int並不會比float更快。

其次,這裡的計算其實是錯誤的。如果y>x>128,y-x>overshoot時用x+overshoot是沒問題的;但是如果128>y>x,這時應該直接取y,而你這裡還是取x+overshoot,顯然是不正確的。同理128>x>y時x-y>undershoot時用x-undershoot是沒問題的;但是如果x>y>128,這時應該直接取y,而你這裡還是取x-undershoot,顯然也是不正確的。diff的處理,如果不想在運算中途考慮符號(減128得到差值的正負號),就應該像我給你的腳本那樣先減128取abs,最後處理符號;如果在中途就考慮符號,就要按128上下分別處理。而像你上面這樣不管128上下,直接用x-y或者y-x,顯然是不行的,像這裡明明是用於limit的lutxy反而有可能導致超出limit範圍甚至比limit前還偏離128的問題。
FTFY

另外,用limit和limit2兩個參數其實就已經是沒必要的了,contra階段在repair之後用lutxy再比較取小應該是任何情況下都需要做的,否則肯定會出現repair前後的x和y中abs(x-128)<abs(y-128)的情況,所以這步不能省,直接用limit就足夠了,就算這裡不考慮over/undershoot直接用原始的contra-sharpen也是一樣的。

最後有個之前沒注意到的問題,contra-sharpen應該是在計算出來的最終diff完成全部的down sample之後做,而不是contra之後再對diff做downsample。因為只對diff做up/down sample是為了降低對源的損失,但是不代表diff的up/down sample過程本身沒有損失,對diff的down sample過程本身也是會產生問題的。如果實在沒辦法也就罷了,而像這裡明顯是可以用contra階段的repair和lutxy來降低diff的down sample過程損失的,不好好利用就太浪費了。可以參考lsfmod,做完全部的down sample之後,對diff進行contra,然後在源上將這個diff加上去。整個流程應該是:

處理用的輸入源和contra-sharpen用的source
-> 取處理用的clip和source間的diff(用於最後contra-sharpen等原始分辨率下的後處理) -> up前的prefilter(temporal limit用的preclip應該是這步完成的,當然你直接用ss後的preclip做downsample下來問題也不大,確實和兩個分別做相比可以節省點資源) # 這幾步是在原始分辨率下
-> upsample
-> up後用於sharpen前處理的prefilter -> 應用kernel blur -> 取blur前後的diff用於ss下的後處理 -> Sharpen -> Slimit -> Soft -> Soothe # 這幾步是在ss的分辨率下
-> downsample
-> Contra-limit -> add diff -> MC temporal limit # 這幾步是down sample回原始分辨率之後再做的