Дано: видеофайл с вшитыми субтитрами.
Требуется: определить точки, где происходит смена субтитров.
Инструменты:
- AviSynth 2.5
- VirtualDubMod, любой версии
- Текстовый редактор
- Microsoft Excel
- Инструмент для подсматривания цвета пиксела в шестнадцатеричном виде
Ход работы
- Для начала нам нужно загрузить файл. Если субтитры не по всей длине, то оставим ту часть, где они есть и нам нужны. Удалим звук — это ускорит обработку.
DirectShowSource("Revolutionary Girl Utena - 05.avi", fps=23.976) s = Trim(21578, 28310).KillAudio()
- Выделим те области, которые близки к цвету букв субтитров.
bin = s.ConvertToRGB32() \ .ColorKeyMask($288028, 30) \ .ShowAlpha()
(цвет и tolerance подбираются опытным путём).
- Теперь у нас есть клип, в котором белый цвет соответствует фону, чёрный — буквам. Когда субтитры сменяются, будет большая разница между соседними кадрами. Выведем в файл среднюю разность яркости.
comma = "," WriteFile(bin.ConvertToYV12(), "05.log", \ "current_frame", "comma", \ "YDifferenceToNext()")
- Теперь берём лог в Excel и начинаем анализировать. Эксперимент показывает, что на всех реальных точках смены титров значение больше 0.64. Но этого условия недостаточно — существуют точки, где разность больше 0.64, но смены титров нет. Смотрим на разницу кадров, видим, что много одиночных меняющихся пикселов на краях букв, и чем больше букв, тем больше и общая разность.
- Тут у нас есть выбор. Мы можем пустить какой-нибудь шумодавящий фильтр. Или мы можем сказать, что, когда смены титра нет, значение разности в соседних кадрах примерно такое же, а когда есть, то на одном кадре наблюдается ярко выраженный максимум.
A B C D 1 0.64 1.1 2 Frame DiffY DiffY' Flag 3 0 0.000003 4 1 0.000003 =2*B4-B3-B5 =IF(AND($B4>=$B$1,$C4>=$C$1),1,0) … … … … … 26 23 0.000003 -1.450016 0 27 24 1.450019 2.647672 1 28 25 0.252363 -1.080742 0 … … … … … 6294 6291 0.716455 0.697207 0 6295 6292 0.720732 0.014257 0 6296 6293 0.710752 0.043487 0 … … … … … - Перевод номеров кадров в часы:минуты:секунды.сотые доли тривиален и оставляется читателю в качестве упражнения.