Auto-Deblock 2

Auto-Deblock ist eine Funktion, welche von joletb und vinylfreak89 geschrieben wurde und von mir den letzten Feinschliff bekommen hat bzw. angepasst wurde.
Auto-Deblock 2 wurde von Gebbi ins Leben geworfen. Es ist eine gründlich überarbeitete Version des Alten. Ich hab diese dann ein wenig überarbeitet.

Das Encode-Pack wird hierfür vorausgesetzt.

Der Effekt kann von Sender zu Sender unterschiedlich sein.
Jedoch sollte das aktuelle Skript eine gute Basis für alle Sender liefern.
Sender wie z.B. TV Tokyo haben deutlich mehr Probleme im Chroma-Bereich als Luma-Bereich. Diese Werte dann ggf. anpassen.

Wie funktioniert das ganze?

Per Masking wird bei jedem Frame geschaut, ob Blocking auftritt. Tritt es auf, wird der Reihe nach geschaut, wie stark es vorliegt und wie es jeweils behandelt wird (sehr schwach, schwach, mittel, stark, sehr stark). Klingt simpel, ist es auch.

Funktioniert das ganze nur für MPEG2?

Getestet wurde es bisher nur mit paar MPEG2-Sources. Abgeändert könnte es auch mit z.B. AT-X oder Crunchyroll (h264) funktionieren. In dieser Form aber unwahrscheinlich.

Hier noch ein Beispiel von mir
(Rechtsklick-> „Bild in einem neuen Tab öffnen“):

Diese Diashow benötigt JavaScript.

Wie sieht die Funktion aus?

#Author: eXmendiC, joletb, vinylfreak89, Gebbi
#Version: 2.6
function AutoDeblock2(clip c, int "edgeValue", int "db1", int "db2", int "db3", bool "deblockY", bool "deblockUV", bool "debug", bool "redfix", bool "fastdeblock", float "adb1", float "adb2", float "adb3", float "adb1d", float "adb2d", float "adb3d") {
 c
 global o = c

 edgeValue = Default (edgeValue, 24)
 db1 = Default (db1, 1)
 db2 = Default (db2, 6)
 db3 = Default (db3, 15)
 deblockY = Default (deblockY, true)
 deblockUV = Default (deblockUV, true)
 debug = Default(debug, false)
 redfix = Default(redfix, false)
 fastdeblock = Default(fastdeblock, false)
 global adb1 = Default (adb1, 3)
 global adb2 = Default (adb2, 4)
 global adb3 = Default (adb3, 8)
 global adb1d = Default (adb1d, 2)
 global adb2d = Default (adb2d, 7)
 global adb3d = Default (adb3d, 11)
 global orig=last.mt_edge("prewitt",0,edgeValue,0,edgeValue)
 global orig_d=mt_edge("prewitt",0,edgeValue,0,edgeValue).removegrain(4).removegrain(4)
 
 fastdeblock0 = debug ? removegrain(2).removegrain(2).deblock_qed.dfttest(tbsize=1).Subtitle("deblock") : removegrain(2).removegrain(2).deblock_qed.dfttest(tbsize=1)
 
 unfiltered = debug ? last.Subtitle("unfiltered") : last
 weakdeblock = debug ? removegrain(2).removegrain(2).Deblock_QED().dfttest(sigma=db1,y=deblockY,u=deblockUV,v=deblockUV,tbsize=1).Subtitle("weakdeblock") : removegrain(2).removegrain(2).Deblock_QED().dfttest(sigma=db1,y=deblockY,u=deblockUV,v=deblockUV,tbsize=1)
 mediumdeblock = debug ? removegrain(2).removegrain(2).Deblock_QED().dfttest(sigma=db2,y=deblockY,u=deblockUV,v=deblockUV,tbsize=1).Subtitle("mediumdeblock") : removegrain(2).removegrain(2).Deblock_QED().dfttest(sigma=db2,y=deblockY,u=deblockUV,v=deblockUV,tbsize=1)
 strongdeblock = debug ? removegrain(2).removegrain(2).Deblock_QED().dfttest(sigma=db3,y=deblockY,u=deblockUV,v=deblockUV,tbsize=1).Subtitle("strongdeblock") : removegrain(2).removegrain(2).Deblock_QED().dfttest(sigma=db3,y=deblockY,u=deblockUV,v=deblockUV,tbsize=1)

 autodeblock0 = ConditionalFilter(fastdeblock0, unfiltered, "(LumaDifference(orig,orig_d) > adb1) && (YDifferenceToNext > adb1d)", "==", "True")
 autodeblock1 = ConditionalFilter(weakdeblock, unfiltered, "(LumaDifference(orig,orig_d) > adb1) && (YDifferenceToNext > adb1d)", "==", "True")
 autodeblock2 = ConditionalFilter(mediumdeblock, autodeblock1, "(LumaDifference(orig,orig_d) > adb2) && (YDifferenceToNext > adb2d)", "==", "True")
 autodeblock3 = ConditionalFilter(strongdeblock, autodeblock2, "(LumaDifference(orig,orig_d) > adb3) && (YDifferenceToNext > adb3d)", "==", "True")
 
 reddeblock = redfix ? ConditionalFilter(unfiltered.vinverse(), autodeblock3, "(AverageLuma(o) > 50) && (AverageLuma(o) < 130) && (AverageChromaU(o) > 95) && (AverageChromaU(o) < 130) && (AverageChromaV(o) > 130) && (AverageChromaV(o) < 155)", "==", "True") : autodeblock3
 fastdeblock ? autodeblock0 : reddeblock
 }

Für Vapoursynth Port HIER klicken.

 

edgeValue = Die Größe des Blockings
db3 (strongdeblock) bis db1 (weakdeblock) = Stärke des Deblocks
deblockY = Deblock auf Luma anwenden
deblockUV = Deblock bei Chroma anwenden
debug = Schauen in welchen Szenen Autodeblock genutzt wird
redfix = Gebbis Fix für versehentliches autodeblocken bei Rottönen
fastdeblock = joletbs schnelle Deblockmethode (Quick & Dirty Prinzip)
[Hinweis: Macht adb2,adb3,adb2d und adb3d nutzlos – kann von redfix überschrieben werden]
adb3 (strongdeblock) bis adb1 (weakdeblock) = Erkennung in Zahlen (niedrige Zahl = erkennt geringe Artefakte schon als Blocking – Kann zu Fehlerkennung führen)
adb3d (strongdeblock) bis adb1d (weakdeblock) = Abgleich mit X Frames nachher (hohe Zahl = erkennt es leichter als dieses Blocking an – Kann zu Fehlerkennung führen)

Advertisements