首先來看mt_hysteresis(small_mask, big_mask)。這個函數是取一個small mask與一個big mask,對於一整塊在big mask裡連通的區域,看small mask裡是否有點位於這個區域內,如果有的話就保留這個區域,如果沒有的話,認為這個區域的big mask是無效的(可能因為噪點等各種原因誤判的部分)。讓我們看一個實例:[syntax lang="avisynth"]
small = mt_edge("roberts", chroma="128")
big = mt_edge("hprewitt", chroma="128")
mt_hysteresis(small, big, chroma="128")[/syntax]
這裡我們希望邊緣既有hprewitt的覆蓋面,又能像roberts那樣盡量減小噪點的干擾,於是對於roberts檢測裡不包含的部分直接從hprewitt中去除,從而得到一個robustness更高的廣域邊緣部分。效果如圖示:
接下來是mt_logic(clip1, clip2, string "mode", int "th1", int "th2")。這是一個對clip1與clip2進行邏輯運算的函數。它支持6個mode,分別是:
mode
= "and",按位與運算,例: 11 & 5 = 1011 & 101 = 1
= "or",按位或運算,例: 11 | 5 = 1011 | 101 = 1111 = 15
= "xor",按位異或運算,例: 11 ^ 5 = 1011 ^ 101 = 1110 = 14
= "andn",按位與非運算,例: 11 & ~5 = 1011 & ~101 = 1011 & 11111010 = 1010 = 10
= "min",取最小值,即 min(clip1+th1, clip2+th2)
= "max",取最大值,即 max(clip1+th1, clip2+th2)
例如前面的[syntax lang="avisynth"]
temporal_bright = src.mt_lutxy(back_compensate, "x y max").mt_lutxy(forw_compensate, "x y max")
temporal_dark = src.mt_lutxy(back_compensate, "x y min").mt_lutxy(forw_compensate, "x y min")[/syntax]
就相當於[syntax lang="avisynth"]
temporal_bright = src.mt_logic(back_compensate, "max").mt_logic(forw_compensate, "max")
temporal_dark = src.mt_logic(back_compensate, "min").mt_logic(forw_compensate, "min")[/syntax]
如果我們想做一個luma自適應的deband,按照luma高時使用src,luma低時使用debanded,同時用edge mask來保護edge的話,可以用mt_logic來組合這個mask:[syntax lang="avisynth"]
edge_mask = src.mt_edge(thY2=255).mt_lut("x 1.2 ^")
luma_mask = src.RemoveGrain(20, -1).mt_lut("x 16 - 255 * 219 /") # 擴張到PC range以填滿0-255
final_mask = mt_logic(edge_mask, luma_mask, "max")
mt_merge(f3kdb, src, final_mask, luma=true)[/syntax]
這裡的f_mask就包含了edge mask與luma mask的最大值,從而對不需要做deband的亮區與線條都做了保護。
mt_invert,這是一個非常簡單的函數,相當於mt_lut("255 x -"),即每個像素直接取255-x,得到一個與原始畫面色彩顛倒的結果。如果用在mask上,就是將mask黑白顛倒過來,例如
mt_merge(a, b, mask, U=3, V=3)就相當於mt_merge(b, a, mask.mt_invert, U=3, V=3)
mt_binarize(clip c, int "threshold", bool "upper", string "mode")
直接將值域為[0, 255]的mask轉為二值mask的函數。例如前面的mt_edge(thY1=10, thY2=10, thC1=10, thC2=10, U=3, V=3)就相當於mt_edge(thY1=0, thY2=255, thC1=0, thC2=255, U=3, V=3).mt_binarize(threshold=10, U=3, V=3),將高於10的像素全部變成255,而低於10的像素全部變成0