DeRainbow script function

(by sh0dan)

[Rainbow Killer (tm)] It completely removes rainbows on the test clip, without any visible quality loss.

It requires msharpen by Donald Graft and MaskTools? by Kuruso and YV12 material...

I fixed it and added a YUY2 version (much slower though), but with no chroma downsampling. I tweaked it a bit for best results on my current material. I also changed the Blur to MipSmooth.

[Discussion]

function DeRainbow(clip org, int "thresh")
{ 
  assert(org.isYV12(),"DeRainbow() requires YV12 input!")
  thresh = default(thresh, 10)

  org_u = utoy(org)
  org_v = vtoy(org)

  msharpen(org, threshold = thresh, mask=true)
  reduceby2()
  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)  
  filtered_v = org_v.mipsmooth(spatial=255, temporal=255, scenechange=3, show=false, method="strong", scalefactor=0.5)

  u_final = MaskedMerge(org_u, filtered_u, uv)
  v_final = MaskedMerge(org_v, filtered_v, uv)

  return ytouv(u_final, v_final, org)
}

function DeRainbowYUY2(clip org, int "thresh")
{
  assert(org.isyuy2(),"DeRainbowYUY2() requires YUY2 input!")
  thresh = default(thresh, 10)

  org_yv12 = org.converttoyv12()
  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", scalefactor=0.5)
  filtered_v = org_v.mipsmooth(spatial=255, temporal=255, scenechange=3, show=false, method="superstrong", scalefactor=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)
}

Usage:

YV12: DeRainbow(int thresh)

YUY2: DeRainbowYUY2(int thresh)

Threshold is optional, and defaults to 10 (which is fairly strong).

Required plugins:

MipSmooth.

Masktools.

mSharpen.