版面规则
提问时请注意:尽量详细描述操作过程、AVS脚本内容等,最好能写出片名,只贴图有时无法看出问题原因。
提示:发布原创内容请尽量使用附件上传。使用网盘会出现过期失效的问题,请注意。
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

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

2012-06-26 22:46

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)
上次由 mawen1250 在 2016-01-08 11:18,总共编辑 113 次。

头像
4h4h270
帖子: 163
注册时间: 2011-04-10 17:59

Re: 【教程】 MaskTools入門教程

2012-06-26 22:57

拜谢MW菊苣

头像
dgwxx
管理猿
帖子: 770
注册时间: 2010-09-19 20:42
联系: 网站

Re: Contra-Sharpen mod 2.2

2012-06-27 8:08

与主题无关的帖子请单独开帖,防止盖歪楼。
日常推 @dgwxx: 基本没什么技术的话题,欢迎没事看看消遣。
► 显示内容 平庸的rip
► 显示内容 “不知道”的五大理由

头像
yabbay
帖子: 62
注册时间: 2012-05-31 10:39
来自: Tokyo

Re: Contra-Sharpen mod 2.2

2012-06-27 9:47

支持楼主 最近一直在用SharpAAMCmod
以后有空试试CSmod
另,如果能有SharpAAMCmod的thin参数功能就更好了(貌似是调用awarpshap2来收缩线条的)
          .∧__,,∧
         ( ´・ω・`) ブルブル
          (つまくら) アリと明日(ant and tomorrow)
          `u―u´ レッツ・エッグ・ペイン(Let`s egg pain)

头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: Contra-Sharpen mod 2.2

2012-06-27 10:35

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

头像
06_taro
核心会员
核心会员
帖子: 998
注册时间: 2010-09-22 18:32
来自: United Kingdom
联系: 网站

Re: Contra-Sharpen mod 2.2

2012-06-27 14:16

相比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貌似也還沒實現,不知道是為什麼…
つまんねー事聞くなよ!

I, personally, for me, believe (obviously sometimes) that my OS choice is right. That's me. I'm not telling you that you should believe it. Learn the facts, and the origins behind the facts, and make up your own damn mind. That's why you have one. (source)

Follow me: @06_taro

304——
为纪念伟大的宇宙史上最强压制304先生,联合国教科文组织决定,将每年的第304天,即平年的10月31日或者闰年的10月30日,定为世界304日。


头像
ikamusume
帖子: 77
注册时间: 2011-03-02 23:13

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

2012-06-27 23:30

{:cat_16} 找天空閒的試試看哇


头像
06_taro
核心会员
核心会员
帖子: 998
注册时间: 2010-09-22 18:32
来自: United Kingdom
联系: 网站

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

2012-07-03 0:23

我寫的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回原始分辨率之後再做的
つまんねー事聞くなよ!

I, personally, for me, believe (obviously sometimes) that my OS choice is right. That's me. I'm not telling you that you should believe it. Learn the facts, and the origins behind the facts, and make up your own damn mind. That's why you have one. (source)

Follow me: @06_taro

304——
为纪念伟大的宇宙史上最强压制304先生,联合国教科文组织决定,将每年的第304天,即平年的10月31日或者闰年的10月30日,定为世界304日。

回到 “AviSynth”