Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.18 KB | None | 0 0
  1. # Asta iti trebe ca din calcule uneori poate sa treaca de intervalu [0. 255] si da eroare poza ca nu stie culori decat in intervalu asta asa ca le pui tu in interval
  2. def clamp(value):
  3. return int(max(min(value, 255), 0))
  4.  
  5. # Iei blocku de 8x8 din matrice care incepe la i,j(are coltu stanga sus in i,j)
  6. def get8x8Block(matrix, i, j):
  7. block = []
  8.  
  9. for ii in range(8):
  10. row = []
  11. for jj in range(8):
  12. row.append(matrix[i + ii][j + jj])
  13. block.append(row)
  14.  
  15. return block
  16.  
  17.  
  18. def convertYUVtoRGB(y, u, v):
  19. # B = 1.164(Y - 16) + 2.018(U - 128)
  20. # G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
  21. # R = 1.164(Y - 16) + 1.596(V - 128)
  22.  
  23. b = 1.164 * (y - 16) + 2.018 * (u - 128)
  24. g = 1.164 * (y - 16) - 0.813 * (v - 128) - 0.391 * (u - 128)
  25. r = 1.164 * (y - 16) + 1.596 * (v - 128)
  26.  
  27. return r, g, b
  28.  
  29.  
  30. def convertRGBtoYUV(r, g, b):
  31. # Y = 0.299 * R + 0.587 * G + 0.114 * B
  32. # U = 128 - 0.1687 * R - 0.3312 * G + 0.5 * B
  33. # V = 128 + 0.5 * R - 0.4186 * G - 0.0813 * B
  34.  
  35. y = 0.299 * r + 0.587 * g + 0.114 * b
  36. u = 128 - 0.1687 * r - 0.3312 * g + 0.5 * b
  37. v = 128 + 0.5 * r - 0.4186 * g - 0.0813 * b
  38.  
  39. return y, u, v
  40.  
  41.  
  42. def convertFrom8x8Blocks(matrix, blocks, width, function=lambda x: x):
  43. for idx, block in enumerate(blocks):
  44. # Asta e formula ca sa gasesti coltu stanga sus in matricea ta unde vine pus blocu ala. Faci (width/8) pentru ca atatea blocuri ai pe un rand si dupa inmultesti iar cu 8 pentru ca blocurile sunt de 8x8
  45. row_number = idx // (width / 8) * 8
  46. col_number = idx % (width / 8) * 8
  47. # Pentru U si V faci upsample daca e data functia ca param si pentru Y se aplica lambda aia si ramane la fel
  48. sample = function(block)
  49. for i in range(8):
  50. for j in range(8):
  51. matrix[row_number + i][col_number + j] = sample[i][j]
  52.  
  53. return matrix
  54.  
  55.  
  56. def createBlocks(matrix, height, width, function=lambda x: x):
  57. blocks = []
  58.  
  59. for i in range(0, height, 8):
  60. for j in range(0, width, 8):
  61. # Aici pui blocku in lista si daca e U sau V ii faci downsample daca nu se aplica lamba aia si mane la fel
  62. blocks.append(function(get8x8Block(matrix, i, j)))
  63.  
  64. return blocks
  65.  
  66.  
  67. def downSample(block):
  68. sample = []
  69. # Iei 2x2 colutile si le faci media si iti iese un bloc si asa din 8x8 -> 4x4
  70. for i in range(0, 8, 2):
  71. row = []
  72. for j in range(0, 8, 2):
  73. average = (block[i][j] + block[i + 1][j] + block[i][j + 1] + block[i + 1][j + 1]) / 4
  74. row.append(average)
  75. sample.append(row)
  76.  
  77. return sample
  78.  
  79.  
  80. def upSample(block):
  81. sample = []
  82. #Dublezi cam toate valorile de 2 ori o data pe linie si o data pe coloana
  83. for i in range(4):
  84. row = []
  85. for j in range(4):
  86. row.append(block[i][j])
  87. row.append(block[i][j])
  88. sample.append(row)
  89. sample.append(row)
  90.  
  91. return sample
  92.  
  93.  
  94. def printBlocks(blocks):
  95. for block in blocks:
  96. print('--------BlockStart--------')
  97. for line in block:
  98. print(line)
  99. print('--------EndStart--------')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement