NMM视频技术(旧)

 找回密码
 成为会员
搜索
查看: 7740|回复: 17

IVTC小技巧 画中画的处理方法

[复制链接]
发表于 2009-9-4 08:09 | 显示全部楼层 |阅读模式
画中画是映像特典、片头片尾中经常出现的表现手法。但很多时候叠加制作画中画都是telecine之后,因此常常出现画中画和背景pattern不同的情况,没有办法IVTC,只能deinterlace。同时,两方的动态也很难统一起来,造成两边动态都不流畅。今天介绍一个小把戏,可以让两边都实现自动IVTC。
整体的思路是,将两边的画面分离,分别IVTC,再重新overlay到一起。但这时就出现一个问题,那就是画中画部分的画面还好说,用crop切出来、IVTC就可以。背景的IVTC因为有画中画干扰,自动处理又不能指定画面范围,所以很难办。所以,这个技巧中最重要的一环就是排除前景对于背景IVTC的干扰。
原始画面:
1.png
首先用crop把前景切出来、IVTC:
2.png
  1. s = MPEG2Source(d2v).trim(420,719)
  2. box = s.crop(142,88,432,308).tfm(mode=3, pp=0, slow=2, chroma=true).tdecimate(mode=1)
复制代码
然后,用BlankClip生成一个等大的黑色画面、用overlay盖在原本画中画的位置、将这个画面送去IVTC:
3.png
  1. black = BlankClip(300, 432, 308, "YV12", s.framerate).killaudio
  2. background = overlay(s, black, 142, 88).tfm(mode=3, pp=0, slow=2, chroma=true).tdecimate(mode=1)
复制代码
之后再把IVTC完成的两个画面重新overlay到一起:
  1. overlay = overlay(background, box, 142, 88)
  2. return overlay
复制代码
就大功告成了。

全部代码:
  1. s = MPEG2Source(d2v).trim(420,719)
  2. box = s.crop(142,88,432,308).tfm(mode=3, pp=0, slow=2, chroma=true).tdecimate(mode=1)
  3. black = BlankClip(300, 432, 308, "YV12", s.framerate).killaudio
  4. background = overlay(s, black, 142, 88).tfm(mode=3, pp=0, slow=2, chroma=true).tdecimate(mode=1)
  5. overlay = overlay(background, box, 142, 88)
  6. return overlay
复制代码
发表于 2009-9-4 11:33 | 显示全部楼层
尝试过类似的方法,不过自己是用ASS字幕来制作黑色框遮住画中画
但是.可怜那个画中画的宽是奇数....而且背景有樱花飞舞.和画中画的边缘帖的很紧...
所以无论多切还是少切,边缘地带的效果都不理想.....
发表于 2009-9-4 16:41 | 显示全部楼层
本帖最后由 diseac 于 2009-9-6 11:23 编辑

受dgwxx启发,写了这个脚本:slicedecomb2

新的slicedecomb2在6楼。
发表于 2009-9-4 18:16 | 显示全部楼层
那些位置会移动的画中画该怎么整呢..
发表于 2009-9-4 18:28 | 显示全部楼层
那些位置会移动的画中画该怎么整呢..
蓝の回忆 发表于 2009-9-4 18:16


trim处理,或者直接做成30p/60p
发表于 2009-9-5 03:14 | 显示全部楼层
slicedecomb2 更新:

slicedecomb2 (int "x1", int "y1", int "x2", int "y2", string "func1", string "func2", bool "fill", bool "debug", int "debug_outline")

x1,y1,x2,y2 - 正整数,切边数值,分别对应左、上、右、下。
func1 - 字符串,对剪切框部分使用的滤镜
func2 - 字符串,对剪切框部分使用的滤镜,当func2未被定义时,func2=func1。
fill - True/False,切边后补黑边,应用滤镜后再切掉。True=补黑边,False=不补。默认False
debug - True/False,纠错模式。打开debug后将输出RGB32
debug_outline - 整数,标记框的扩边方向和宽度,为正时向外扩边,反之向内。默认1,不可为0。当x1,y1,x2,y2任一为0时只能向内扩边。


目前没有解决的问题:
3) 自适应切奇数边。(目前还没想好处理方法)
4) slicedecomb3:多个slice处理。(目前还没碰到这种片源)

  1. function slicedecomb2 (clip v, int "x1", int "y1", int "x2", int "y2",
  2. \ string "func1", string "func2", bool "fill", bool "debug", int "debug_outline") {

  3. xyse = (x1<0 || y1<0 || x2<0 || y2<0) ? true : false
  4. func2 = default(func2,func1)
  5. debug = default(debug,false)
  6. fill = default(fill,false)
  7. debug_outline = default(debug_outline,1)
  8. debug_outline = debug_outline==0 ? 1 : debug_outline
  9. pixel_type = "YV12"
  10. pixel_type = v.IsRGB24 ? "RGB24" : pixel_type
  11. pixel_type = v.IsRGB32 ? "RGB32" : pixel_type
  12. pixel_type = v.IsYUY2 ? "YUY2" : pixel_type

  13. vv1 = fill
  14. \ ? eval("v.crop(x1,y1,0-x2,0-y2).addborders(x1,y1,x2,y2)"+func1).crop(x1,y1,0-x2,0-y2)
  15. \ : eval("v.crop(x1,y1,0-x2,0-y2)"+func1)
  16. vvb = BlankClip(length=v.framecount,width=v.width-x1-x2,height=v.height-y1-y2,pixel_type=pixel_type,fps=v.framerate,color=$000000)
  17. vv2 = eval("overlay(v,vvb,x=x1,y=y1)"+func2)
  18. vv1 = debug ? vv1.converttorgb32 : vv1
  19. vv2 = debug ? vv2.converttorgb32 : vv2

  20. dbow = debug ? debug_outline>0 ? overlay(
  21. \ overlay(vv2,vv2.crop(x1-debug_outline,y1-debug_outline,0-x2+debug_outline,0-y2+debug_outline).Invert,x=x1-debug_outline,y=y1-debug_outline),
  22. \ vv1,x=x1,y=y1).subtitle("slicedecomb2 Debug | Outline="+string(debug_outline)+"px(Outward)",align=3) : nop : nop
  23. dbiw = debug ? debug_outline<0 ? overlay(vv2,
  24. \ overlay(vv1.Invert,vv1.crop(0-debug_outline,0-debug_outline,debug_outline,debug_outline),x=0-debug_outline,y=0-debug_outline)
  25. \ ,x=x1,y=y1).subtitle("slicedecomb2 Debug | Outline="+string(debug_outline)+"px(Inward)",align=3): nop : nop

  26. return xyse ? BlankClip.subtitle("slicedecomb2 Error : x1 y1 x2 y2 could NOT be less than 0")
  27. \ : debug ? debug_outline>0 ? dbow : dbiw : overlay(vv2,vv1,x=x1,y=y1)
  28. }
复制代码
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

slicedecomb2(142,88,146,84,"AAD()","AAD()",debug=true)
000164.jpg
发表于 2009-10-6 11:28 | 显示全部楼层
说来最近碰到了个30i实写+30tele画中画还满屏乱飞的片源...分段画中画的话又太麻烦了(10分钟多一点的东西要分10多段...),不知大侠和d大神有无良方...
 楼主| 发表于 2009-10-6 18:33 | 显示全部楼层
7# akiduki
现有的方法里面大概也只有aadtrim结合dちゃん的脚本来做是最便捷的了吧(话说aadtrim也是dちゃん造福广大ripper的福音啊=v=)。
那种画中画在屏幕上不断移动的片子已经内牛满面了。
发表于 2009-10-6 20:38 | 显示全部楼层
谢谢大虾抬爱~(害羞

30i上叠加pulldown的场景我只见过动画片ED里的画中画,实写+pulldown还满屏乱飞的没做过

我感觉实写里最恶心的当属眼镜、深色毛衣/棉质T恤、不刮胡子的人、LIVE演出。有些东西解掉交错预览起来很好,压出来就崩溃了。所以同求30i实写比较好的解交错的方法…

对于30i实写,我会按 DG系列硬解 → TempGaussMC_beta1mod(nnedi2) → nnedi2 这个顺序尝试。30i+pulldown的就分段vfr了,有时候段太多就IVTC不删帧,30i上叠加pulldown的只好crop出来IVTC不删帧,或者直接来硬的(blend)
发表于 2009-10-9 11:04 | 显示全部楼层
d叔的描述总是那么的vivid-.-
telecine的部分倒不是满屏乱飞,只是时不时从屏幕某一处移到另一处(还伴随着可能的大小变化),而且因为总片长不长,就显得非常零散。

DG的硬解对准静态的场面,比如访谈类sp的效果很好,其它的总觉得不算很理想。我还是倾向于nnedi2这种算法完成(修正:软件实现)的deinterlacer。

介于这个sp也不是啥重要的东西,我想霸王硬上弓了...
发表于 2009-10-9 12:40 | 显示全部楼层
※小玩笑无恶意
mukai.jpg
 楼主| 发表于 2009-10-9 21:07 | 显示全部楼层
dちゃん的头像越来越萌了
发表于 2010-8-14 23:07 | 显示全部楼层
弱弱的问下!
如果AAD里又需要使用OVR,那么就需要再加引号,可这样子avs就不认了.
想问问这样子要怎么写!
谢谢!
发表于 2010-8-15 12:37 | 显示全部楼层
三重引号
参考ClipSlice的使用范例
http://www.nmm-hd.org/doc/index. ... ce&variant=zh-c
发表于 2010-8-15 17:54 | 显示全部楼层
谢谢
发表于 2010-8-15 21:27 | 显示全部楼层
cp           对选取的clip段落引用外部滤镜或脚本进行处理,默认无处理 (string)
ep1          对选取外的clip段落的前一段引用外部滤镜或脚本进行处理,默认无处理 (string)
ep1          对选取外的clip段落的后一段引用外部滤镜或脚本进行处理,默认无处理 (string)
# cp ep1 ep2可以使用影响帧数并且不影响帧率的滤镜脚本,比如trim
# 但不要使用影响到帧率/颜色空间/分辨率等会影响到拼接的滤镜脚本
# 或者使用后将其帧率/颜色空间/分辨率等还原

话说说明里有错字第二个是ep2吧
发表于 2010-8-15 21:40 | 显示全部楼层
本帖最后由 Yuricon 于 2010-8-15 21:42 编辑

回复 047007-AgN 的帖子
readme里确实写错了OTZ
还是看NMMDOC吧,那里排版更好
今天可能会更新版本,新版DOC需要时间编辑
发表于 2010-9-30 19:33 | 显示全部楼层
slicedecomb2 更新:

slicedecomb2 (int "x1", int "y1", int "x2", int "y2", string "func1", string  ...
diseac 发表于 2009-9-5 03:14



为啥我看到蛋疼的白边- -!
XY偏移一点还是咋的?
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

小黑屋|手机版|NMM视频技术

GMT+8, 2018-12-15 06:05 , Processed in 0.115297 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表