Advertisement
Guest User

Untitled

a guest
May 7th, 2010
391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.87 KB | None | 0 0
  1. #ОПИСАНИЕ:
  2. #------------------------------------------------------------------------------------------------------------------------------
  3. # function BalanceBorders(clip c, int cTop, int cBottom, int cLeft, int cRight, int "thresh", int "blur")
  4. #
  5. # //by PL — [2009.09.25] v0.2 :)
  6. #
  7. # Функция изменяет значения крайних пикселей клипа так, чтобы они были "более похожи" на соседние,
  8. # что, возможно, позволит избежать "сильного" использования Crop() для удаления "неприятных краёв",
  9. # не очень сильно отличающихся от "основного" изображения. См. примеры скринов.
  10. #------------------------------------------------------------------------------------------------------------------------------
  11.  
  12. #ПАРАМЕТРЫ:
  13. #------------------------------------------------------------------------------------------------------------------------------
  14. # с - любой YV12 клип. Область изображения "в середине" в процессе обработки не изменяется.
  15. #
  16. # cTop, cBottom, cLeft, cRight - range[0..inf]
  17. # количество изменяемых пикселей с каждой стороны.
  18. # Не случится ничего очень страшного, если указать значения,
  19. # больше необходимого в вашем случае минимума,
  20. # но, для достижения хорошего результата, "лучше не надо"...
  21. #
  22. # "thresh" - range[0..128] default[128] recommended[0..16 или 128]
  23. # порог допустимых изменений для локального подбора цвета.
  24. #
  25. # "blur" - range[1..inf] default[999] recommended[1..20 или 999]
  26. # степень размытия для локального подбора цветов,
  27. # меньшие значения дают более точное соответствие цветов,
  28. # большие значения дают более точную передачу рисунка.
  29. #-------------------------------------------------------------------------------------------------------------------------------
  30.  
  31. #СОВЕТЫ:
  32. #-------------------------------------------------------------------------------------------------------------------------------
  33. # 1)При значениях по умолчанию thresh=128 blur=999 вы получите ряды пикселей,
  34. # изменённые только подбором цвета для каждого ряда целиком, без локального подбора,
  35. # т.е. цвета соседних пикселей могут сильно отличатся в некоторых местах,
  36. # но при этом не произойдёт изменения характера рисунка.
  37. # А при thresh=128 и blur=1 вы получите практически одинаковые ряды пикселей,
  38. # т.е. цвета между ними будут совпадать полностью, но оригинальный рисунок потеряется.
  39. #
  40. # 2)Остерегайтесь использования большого количества пикселей для изменения в сочетании с большим уровнем "thresh", и маленьким "blur"
  41. # это может привести к появлению нежелательных артефактов "на чистом месте".
  42. # Старайтесь для каждого вызова функции установить как можно меньшее количество пикселей для изменения и
  43. # как можно меньшее значение порога "thresh" (при использовании blur 0..16).
  44. #-------------------------------------------------------------------------------------------------------------------------------
  45.  
  46. #ПРИМЕРЫ:
  47. #-------------------------------------------------------------------------------------------------------------------------------
  48. # Минимально необходимый вариант из двух вызовов (количество изменяемых пикселей, естественно, указано для примера):
  49. # BalanceBorders(7,6,4,4)
  50. # BalanceBorders(7,6,4,4, thresh=4,blur=10)
  51. #
  52. # Вариант нескольких вызовов поряд:
  53. # BalanceBorders(7,6,4,4) //"общий" подбов цветов
  54. # BalanceBorders(5,5,4,4, thresh=2, blur=10) //совсем чуть-чуть изменяет большую область (с "запасом")
  55. # BalanceBorders(3,3,2,2, thresh=8, blur=4) //несильно изменяет "основную проблемную область"
  56. # BalanceBorders(1,1,0,0, thresh=128, blur=1) //заменяет верхнюю и нижнюю строку пикселей (для удаления "чёрных полос")
  57. #-------------------------------------------------------------------------------------------------------------------------------
  58.  
  59.  
  60. function BalanceBordersGT(clip c, int cTop, int cBottom, int cLeft, int cRight, int "thresh", int "blur")
  61. {
  62. Assert(isYV12(c), "This is not an YV12 clip. Convert color space to YV12 before using BalanceBorders().")
  63.  
  64. thresh = Default(thresh, 128)
  65. blur = Default(blur, 999)
  66.  
  67. Assert(blur > 0, "Blur parameter in BalanceBorders() must be > 0")
  68. Assert(thresh > 0, "Thresh parameter in BalanceBorders() must be > 0")
  69.  
  70. c
  71. w=c.width
  72. h=c.height
  73. xTop=c.Crop(0,0,0,32)
  74. xTop=cTop >0 ? xTop.BalanceTopBorder(cTop, thresh, blur) : xTop
  75. xLeft=stackvertical(xTop.Crop(0,0,32,0), c.Crop(0,32,32,0))
  76. xLeft=(cLeft >0) ? xLeft.TurnRight().BalanceTopBorder(cLeft, thresh, blur).TurnLeft() : xLeft
  77. xBottom=stackhorizontal(xLeft.Crop(0,h-32,0,0),c.Crop(32,h-32,0,0))
  78. xBottom=(cBottom >0) ? xBottom.Turn180().BalanceTopBorder(cBottom, thresh, blur).Turn180() : xBottom
  79. xRight=stackvertical(xTop.Crop(w-32,0,0,0),c.Crop(w-32,32,0,-32),xBottom.Crop(w-32,0,0,0))
  80. xRight=(cRight >0) ? xRight.TurnLeft().BalanceTopBorder(cRight, thresh, blur).TurnRight() : xRight
  81. xCenter=c.crop(32,32,-32,-32)
  82. s=stackVertical(xTop.Crop(32,0,-32,0),xCenter)
  83. s=stackHorizontal(xLeft.Crop(0,0,0,-32),s)
  84. s=stackVertical(s,xBottom.Crop(0,0,-32,0))
  85. s=stackHorizontal(s,xRight)
  86. s
  87. }
  88. function BalanceTopBorder(clip c, int cTop, int "thresh", int "blur")
  89. {
  90. cWidth = c.width
  91. cHeight = c.height
  92. cTop = min(cTop,cHeight-1)
  93. blurWidth = max(4,floor(cWidth/blur))
  94.  
  95. c2 = c.PointResize(cWidth*2,cHeight*2)
  96.  
  97. c2.\
  98. Crop(0,cTop*2,cWidth*2,2)
  99. PointResize(cWidth*2,cTop*2)
  100. BilinearResize(blurWidth*2,cTop*2)
  101. mt_convolution("1 1 1","0 1 0",y=3,u=3,v=3)
  102. BilinearResize(cWidth*2,cTop*2)
  103. referenceBlur = last
  104.  
  105. original = c2.Crop(0,0,cWidth*2,cTop*2)
  106.  
  107. original
  108. BilinearResize(blurWidth*2,cTop*2)
  109. mt_convolution("1 1 1","0 1 0",y=3,u=3,v=3)
  110. BilinearResize(cWidth*2,cTop*2)
  111. originalBlur = last
  112.  
  113. balanced = mt_lutXYZ(original,originalBlur,referenceBlur,"z y - x +",y=3,u=3,v=3)
  114. difference = mt_makeDiff(balanced,original,y=3,u=3,v=3)
  115.  
  116. tp = string(128+thresh)
  117. tm = string(128-thresh)
  118. difference = difference.mt_lut("x "+tp+" > "+tp+" x ?",y=3,u=3,v=3)
  119. difference = difference.mt_lut("x "+tm+" < "+tm+" x ?",y=3,u=3,v=3)
  120.  
  121. mt_addDiff(original,difference,y=3,u=3,v=3)
  122.  
  123. StackVertical(last,c2.Crop(0,cTop*2,cWidth*2,(cHeight-cTop)*2)).PointResize(cWidth,cHeight)
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement