にわとり遊び
PC関連とエンコードの覚書き
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

多局ブレンドでクリップ間に差異があるとき一方のクリップに上書きを行う - OverDiff (その2)
特に改良もしてないですけど、上手いこといったので。

TXとBSJの「テレビから離れて」テロップはフェードするので輝度差判定がしにくいのですが、
OverDiffのfilterを判定、filter2を上書き領域として分担することで概ねカバーできました。
具体的には、テロップの「テ」の上の棒部分だけをfilterで比較し、テロップ全体を覆う領域をfilter2として記述します。
TX=OverDiff(TX,BSJ,"crop(428,104,28,6)",28,6,"crop(400,40,1120,250)",400,40)

-1.png

それでもテロップ出現1フレーム目↑は薄すぎて拾えません。
でも2ソースを合成する際に使用するFlexibleMergeは、コーミングチェックによりノイズの判定をしているので、フェード効果によって発生するインターレースの影響で結果的に消えます。↓

2.png

位置固定で出てくるテロップはこの方法でほとんど消えてくれると思います。


残すところはBS11の赤いやつ。フェードする上に動くので、領域を絞って判定する事ができないし、
色も暗くて輝度差も取りにくいので、今のやり方では難しそう。
スポンサーサイト
多局ブレンドでクリップ間に差異があるとき一方のクリップに上書きを行う - OverDiff
多局ブレンドを行う際、毎回出る局独自の宣伝テロップや番組内提供など、出現フレームが毎回変わるものに対して使用します。テロップがフェードする場合は不完全になるので使わないほうがいいです。

0_20150124180237ae6.png

1_20150124180236555.png

BS11=OverDiff(BS11,MX,"crop(1100,580,-100,500)",1100,580,"crop(1670,40,150,80)",1670,40)
BS11=OverDiff(BS11,MX,"crop(1670,40,150,80)",1670,40)
番組内提供をMXのものに上書きし、提供間のロゴを処理しています。
ロゴだけの処理だと判定漏れ多発するので、提供の判定があるうちはロゴ部分も上書きするようにしています。
ただし、提供が出るまでの前後は背景によっては判定漏れします。


function OverDiff (clip clip1,clip clip2,string "filter",int "x",int "y",string "filter2",int "x2",int "y2",int "luma",bool "show") {
x=default(x,0)
y=default(y,0)
x2=default(x2,0)
y2=default(y2,0)
luma=default(luma,133)
global luma=luma
c1=(defined(filter)) ? eval("clip1."+filter) : clip1
c2=(defined(filter)) ? eval("clip2."+filter) : clip2
c2_2=(defined(filter2)) ? eval("clip2."+filter2) : nop
diff=Overlay(c1,c2,mode="difference")
clip3=Overlay(clip1,c2,x=x,y=y)
clip3=(defined(filter2)) ? Overlay(clip3,c2_2,x=x2,y=y2) : clip3
clip=ConditionalFilter(diff,clip1,clip3,"AverageLuma","<","luma",show=show)
return clip
}

clip1 - ベースとなるクリップ
clip2 - clip1に上書きするクリップ
filter - 双方のクリップを比較・上書きするためのcropを記述する。
x,y - Overlayのx,y位置
filter2 - 上書き判定が出た際、こちらも合わせて上書きする。判定には影響しない。
x2,y2 - filter2でのOverlayのx,y位置
luma - 比較クリップの差のしきい値
show - ConditionalFilterによるshowオプションを表示する
2つのソースからノイズの無い部分を選んでブレンドする (FlexibleMerge) その2
※Combcheckの記述ミスってたので訂正。入力クリップそのまま返してました。影響があるのはshow=1,2でノイズ量を目視確認するときだけなので、必要なければスルーでいいです。使うときは↓赤字で書いたclip=を書き足してやってください。

FlexibleMergeに機能を追加
exc - [default=0] 0 無効。以前と同じ。/1 NoiseExcludeを使う。ノイズの差がnmax以上の場合はclip1を返す。/2 NoiseExcludeを使う。ノイズの差がnma以上の場合、clip1とclip2のうちノイズ量が少ないクリップを返す。
nmax - [default=30] excが1,2で有効。2つのクリップのノイズ量の差がこの値以上ならMergeしない。
show - [default=0] 0 通常の出力。/1 出力クリップのノイズを強調。/2 入出力クリップを3つ並べてノイズを強調。/3 excが有効の場合、2つのクリップのノイズ差と出力結果を表示する。

function NoiseExclude
2つのクリップのノイズ量を比較して、差が設定(nmax)より大きい場合は片方のクリップのみを返す関数。
FlexibleMerge内部で使用。


function FlexibleMerge (clip clip1,clip clip2,float "weight",float "weight2",int "mode",int "x",int "y",int "thr",int "show",int "exc",int "nmax") {
thr=default(thr,10)
weight=default(weight,0.5)
weight2=default(weight2,0.9)
mode=default(mode,0)
cx=default(x,0)
cy=default(y,0)
show=default(show,0)
exc=default(exc,0)
clip2=(mode==0) ? clip2 : Overlay(clip1,clip2,x=cx,y=cy)

Mask1=CombMask(clip1, thY1 = thr, thY2 = thr)
Mask2=CombMask(clip2, thY1 = thr, thY2 = thr)
mask3=mt_invert(mask2)#2がきれい
mask4=mt_logic(mask2,mask1,mode="andn")#1にノイズ、2はきれい

clip3=Merge(clip1,clip2,weight)
clip4=Merge(clip1,clip2,weight2)
clip=mt_merge(clip1,clip3,mask3,luma=true)
clip=mt_merge(clip,clip4,mask4,luma=true)

clip=(exc>0) ? NoiseExclude(clip,clip1,clip2,mode=exc,thr=nmax,showi=show) : clip

clip=(show==1) ? Combcheck(clip) :
\(show==2) ? StackHorizontal(Combcheck(clip1),Combcheck(clip2)).ReduceBy2.StackVertical(ReduceBy2(Combcheck(clip)).AddBorders(clip.width/4,0,clip.width/4,0)) : clip
return clip
}

function NoiseExclude (clip clip,clip clip1,clip clip2,int "mode",int "thr",int "showi") {
mode=default(mode,1)
thr=default(thr,30)
showi=default(showi,0)
global thr=thr
show=(showi==3) ? true : false
c1=CombMask(clip1, thY1 = 10, thY2 = 10)
c2=CombMask(clip2, thY1 = 10, thY2 = 10)
clip1=(show) ? clip1.Subtitle("1") : clip1
clip2=(show) ? clip2.Subtitle("2") : clip2
clipSelect=conditionalfilter(interleave(c1,c2),clip1,clip2,"AverageLuma(SelectEven)","<","AverageLuma(SelectOdd)")
clip=(mode==1) ? ConditionalFilter(interleave(c1,c2),clip,clip1,"abs(AverageLuma(SelectEven)-AverageLuma(SelectOdd))","<","thr",show)
\ : ConditionalFilter(interleave(c1,c2),clip,clipSelect,"abs(AverageLuma(SelectEven)-AverageLuma(SelectOdd))","<","thr",show)
return clip
}

function Combcheck (clip clip) {
clip=mt_merge(Grayscale(clip),ColorYUV(Grayscale(clip),gain_u=100,gain_v=100),CombMask(clip,thY1=16,thY2=16),luma=true)
return clip
}


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。