Из многообразия дефектов видео рассмотрим встречающиеся при обработке аналоговых сигналов радужные полосы, наблюдаемые в местах с высоким контрастом яркости, часто на титрах. Дефекты эти свойственны композитному (смешанному) сигналу, из-за перекрестного влияния яркости и цветности, если не используется качественный аппаратный (так называемый гребенчатый) фильтр для подавления этих помех. Есть плагины
GuavaComb (разработчик "Lindsey Dubb"),
TComb (разработчик "tritical"),
BiFrost (разработчик Fredrik Mellbin) для устранения подобных помех методом усреднения во времени соседних кадров (главным образом для NTSC, и только для статичных сюжетов). Другим методом является пространственное сглаживание подобных участков. В наиболее эффективном алгоритме
Rainbow Killer («убийца радуг») сначала ищутся резкие края объектов в яркостном канале, а затем производится размытие каналов цветности вблизи найденных краев. Алгоритм реализован в скрипте-функции
DeRainbow (составитель "sh0dan"). Используются плагины
Msharpen (разработчик Donald Graft) для построение маски краев,
MipSmooth (разработчик "sh0dan") для размытия, и
MaskTools (разработчики "Kurosu", "Manao") для объединения. Отметим, что функция
DeRainbow подразумевает прогрессивный входной клип формата YV12, для цветового формата YUY2 есть аналогичная функция DeRainbowYUY2. Для чересстрочного видео используйте разбивку на поля. Подавление шума (и повышение резкости) лучше делать после удаления радуги.
# Пример скрипта 15.1
# Функция DeRainbow (от sh0dan) для удаления радужных полос
# Использует плагины Msharpen, MipSmooth, MaskTools
function DeRainbow(clip org, int "thresh")
{
assert(org.isYV12(),"DeRainbow() requires YV12 input!")
# проверка формата с сообщением
thresh = default(thresh, 10)
# значения параметра порога по умолчанию =10
org_u = UtoY(org) # из цветности U в яркостный канал
org_v = VtoY(org) # из цветности V в яркостный канал
msharpen(org, threshold = thresh, mask=true)
# маска резких краев
bilinearresize(last.width/2, last.height/2)
# маска половинной высоты
greyscale() # в градации серого
uv = blur(1.5).levels(0,2.0,255,0,255, coring=false)
.blur(1.5).blur(1.5).levels(50,2.0,255,0,255, coring=false)
# расширяем в маске найденные края
filtered_u = org_u.mipsmooth(spatial=255, temporal=255,
scenechange=3 ,show=false, method="strong", scalefactor=0.5)
# размываем бывший канал цветности U
filtered_v = org_v.mipsmooth(spatial=255, temporal=255,
scenechange=3 ,show=false, method="strong", scalefactor=0.5)
# размываем бывший канал цветности V
u_final = MaskedMerge(org_u, filtered_u, uv)
# заменяем U на размытый там где маска
v_final = MaskedMerge(org_v, filtered_v, uv)
# заменяем V на размытый там где маска
return YtoUV(u_final, v_final, org)
# заменяем U, V оригинала на фильтрованные
}
################################################## ######
# Функция для удаления радужных полос для формата YUY2
function DeRainbowYUY2(clip org, int "thresh")
{
assert(org.isyuy2(),"DeRainbowYUY2() requires YUY2 input!")
thresh = default(thresh, 10)
org_yv12 = org.converttoyv12()
# преобразуем в YV12 для MaskTools и скорости
org_u = utoy(org).converttoyv12()
org_v = vtoy(org).converttoyv12()
msharpen(org_yv12, threshold = thresh, mask=true)
bilinearresize(last.width/2, last.height)
greyscale()
uv = blur(1.5).levels(0,2.0,255,0,255, coring=false)
.blur(1.5).blur(1.5).levels(50,2.0,255,0,255, coring=false)
filtered_u = org_u.mipsmooth(spatial=255, temporal=255,
scenechange=3,show=false,method="superstrong",scal efactor=0.5)
filtered_v = org_v.mipsmooth(spatial=255, temporal=255,
scenechange=3,show=false,method="superstrong",scal efactor=0.5)
u_final = MaskedMerge(org_u, filtered_u, uv).converttoyuy2()
v_final = MaskedMerge(org_v, filtered_v, uv).converttoyuy2()
return ytouv(u_final, v_final, org)
}
################################################## ######
LoadPlugin("C:PluginsDeGrainMedian.dll") # загружаем плагин
AviSource("d:videovideo.avi")
# видеофайл, пусть формат YUY2 чересстрочный
A=Trim(0,1234) # пусть первая часть клипа без радуги
B=Trim(1235,4567) #пусть вторая часть клипа, имеется радуга
C=Trim(4568,0) # пусть третья часть клипа до конца — без радуги
B=SeparateFields(B) # разделяем на поля
B=DeRainbowYUY2(B,10) # подавляем радугу в клипе B
B=Weave(B) # соединяем поля
A + B + C # объединяем клипы (с синхронизацией)
DeGrainMedian(limity=2,interlaced=true) # подавляем шум
SeparateFields() # разделяем на поля
LimitedSharpen() # повышаем резкость
Weave() # соединяем поля