2016-11-29, 04:58 PM
DeSub - automatic hardcoded subtitles removal (Avisynth script)
Is it too good to be true? Well, it needs two clips, one with subtitles (or logo), and the other without; will create a mask "on the fly", and the subtitles (logo) will be replaced with the corresponding part of the image of the clip without logo.
For best result, it's better to limit usage only to frames with subtitles; clips must be aligned perfectly, both temporally and spatially; must have the same (or very similar) colors; it's always possible to merge the result and the existing not subbed clip to improve quality.
Include it into your avisynth script or save it as DeSub.avsi and put into your AviSynth plugins folder.
EDIT: WARNING! IT WORKS ONLY WITH WHITE SUBTITLES!!!
Code:
###########################################################################################
### DeSub 1.0: removes the subtitles with no need to prepare a mask for every line! ###
### ###
### Two spatially and aligned clips are needed, one with hardcoded subtitles, or logo, ###
### and the other without; the script creates a mask "on the fly" that will be used to ###
### cover the subtitles with the corresponding parts of the clip without them. ###
### ###
### Usage: DeSub(clipwithoutsubs,clipwithsubs,subcolor) ###
### ###
### Example: goodclip.avi has subtitles, badclip.avi has no subtitles, subs color white ###
### ###
### DeSub(goodclip,badclip,$ffffff) ###
### ###
### It is highly reccomended to use it only on frames with subtitles ###
### Possible update: limit the use to a certain area of the frame, perfect for logo! ###
### ###
### AviSynth script made by spoRv (http://blog.sporv.com) - Created: 2016-11-29 ###
### ###
### Creative Commons 4,0 - Attribution-NonCommercial-ShareAlike 4.0 (CC BY-NC-SA 4.0) ###
### Link to the licence page: https://creativecommons.org/licenses/by-nc-sa/4.0 ###
###########################################################################################
function DeSub (clip nosubs, clip withsubs, val "color") {
withsubs=withsubs.converttoyv24
nosubs=nosubs.converttoyv24
color=default(color,$ffffff)
subs = withsubs.converttorgb
mask = ColorKeyMask(subs, color, 20)
blk = blankclip(length=withsubs.FrameCount,width=withsubs.width,height=withsubs.height)
over=Overlay(withsubs, blk, mask=mask.ShowAlpha, mode="blend", opacity=1)
mk=over.levels(235,1,255,1,255)
w=2
a=mk.addborders(0,0,w,w).crop(w,w,0,0)
b=mk.addborders(0,0,0,w).crop(0,w,0,0)
c=mk.addborders(w,0,0,w).crop(0,w,-w,0)
d=mk.addborders(w,0,0,0).crop(0,0,-w,0)
e=mk.addborders(w,w,0,0).crop(0,0,-w,-w)
f=mk.addborders(0,w,0,0).crop(0,0,0,-w)
g=mk.addborders(0,w,w,0).crop(w,0,0,-w)
h=mk.crop(w,0,0,0).addborders(0,0,w,0)
x= overlay(b, f, mode="add")
y= overlay(d, h, mode="add")
xx=overlay(a, e, mode="add")
yy=overlay(c, g, mode="add")
z= overlay(x, y, mode="add")
zz=overlay(xx,yy,mode="add")
nu=overlay(z,zz,mode="add")
mk=nu.levels(235,1,255,1,255)
w=3
a=mk.addborders(0,0,w,w).crop(w,w,0,0)
b=mk.addborders(0,0,0,w).crop(0,w,0,0)
c=mk.addborders(w,0,0,w).crop(0,w,-w,0)
d=mk.addborders(w,0,0,0).crop(0,0,-w,0)
e=mk.addborders(w,w,0,0).crop(0,0,-w,-w)
f=mk.addborders(0,w,0,0).crop(0,0,0,-w)
g=mk.addborders(0,w,w,0).crop(w,0,0,-w)
h=mk.crop(w,0,0,0).addborders(0,0,w,0)
x= overlay(b, f, mode="add")
y= overlay(d, h, mode="add")
xx=overlay(a, e, mode="add")
yy=overlay(c, g, mode="add")
z= overlay(x, y, mode="add")
zz=overlay(xx,yy,mode="add")
nu=overlay(z,zz,mode="add")
mk=nu.levels(235,1,255,1,255)
w=4
a=mk.addborders(0,0,w,w).crop(w,w,0,0)
b=mk.addborders(0,0,0,w).crop(0,w,0,0)
c=mk.addborders(w,0,0,w).crop(0,w,-w,0)
d=mk.addborders(w,0,0,0).crop(0,0,-w,0)
e=mk.addborders(w,w,0,0).crop(0,0,-w,-w)
f=mk.addborders(0,w,0,0).crop(0,0,0,-w)
g=mk.addborders(0,w,w,0).crop(w,0,0,-w)
h=mk.crop(w,0,0,0).addborders(0,0,w,0)
x= overlay(b, f, mode="add")
y= overlay(d, h, mode="add")
xx=overlay(a, e, mode="add")
yy=overlay(c, g, mode="add")
z= overlay(x, y, mode="add")
zz=overlay(xx,yy,mode="add")
nu=overlay(z,zz,mode="add").levels(235,1,255,1,255)
numask = ColorKeyMask(nu.ConvertToRGB32, color, 30)
Overlay(nosubs, withsubs, mask=numask.ShowAlpha, mode="blend", opacity=1)
converttoyv12
}
I tested it, and seems to work well; of course, could still be improved. Waiting for your test results and impressions!
Examples - top DeSub result, bottom original: