Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 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
- def clamp(value):
- return int(max(min(value, 255), 0))
- # Iei blocku de 8x8 din matrice care incepe la i,j(are coltu stanga sus in i,j)
- def get8x8Block(matrix, i, j):
- block = []
- for ii in range(8):
- row = []
- for jj in range(8):
- row.append(matrix[i + ii][j + jj])
- block.append(row)
- return block
- def convertYUVtoRGB(y, u, v):
- # B = 1.164(Y - 16) + 2.018(U - 128)
- # G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
- # R = 1.164(Y - 16) + 1.596(V - 128)
- b = 1.164 * (y - 16) + 2.018 * (u - 128)
- g = 1.164 * (y - 16) - 0.813 * (v - 128) - 0.391 * (u - 128)
- r = 1.164 * (y - 16) + 1.596 * (v - 128)
- return r, g, b
- def convertRGBtoYUV(r, g, b):
- # Y = 0.299 * R + 0.587 * G + 0.114 * B
- # U = 128 - 0.1687 * R - 0.3312 * G + 0.5 * B
- # V = 128 + 0.5 * R - 0.4186 * G - 0.0813 * B
- y = 0.299 * r + 0.587 * g + 0.114 * b
- u = 128 - 0.1687 * r - 0.3312 * g + 0.5 * b
- v = 128 + 0.5 * r - 0.4186 * g - 0.0813 * b
- return y, u, v
- def convertFrom8x8Blocks(matrix, blocks, width, function=lambda x: x):
- for idx, block in enumerate(blocks):
- # 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
- row_number = idx // (width / 8) * 8
- col_number = idx % (width / 8) * 8
- # Pentru U si V faci upsample daca e data functia ca param si pentru Y se aplica lambda aia si ramane la fel
- sample = function(block)
- for i in range(8):
- for j in range(8):
- matrix[row_number + i][col_number + j] = sample[i][j]
- return matrix
- def createBlocks(matrix, height, width, function=lambda x: x):
- blocks = []
- for i in range(0, height, 8):
- for j in range(0, width, 8):
- # Aici pui blocku in lista si daca e U sau V ii faci downsample daca nu se aplica lamba aia si mane la fel
- blocks.append(function(get8x8Block(matrix, i, j)))
- return blocks
- def downSample(block):
- sample = []
- # Iei 2x2 colutile si le faci media si iti iese un bloc si asa din 8x8 -> 4x4
- for i in range(0, 8, 2):
- row = []
- for j in range(0, 8, 2):
- average = (block[i][j] + block[i + 1][j] + block[i][j + 1] + block[i + 1][j + 1]) / 4
- row.append(average)
- sample.append(row)
- return sample
- def upSample(block):
- sample = []
- #Dublezi cam toate valorile de 2 ori o data pe linie si o data pe coloana
- for i in range(4):
- row = []
- for j in range(4):
- row.append(block[i][j])
- row.append(block[i][j])
- sample.append(row)
- sample.append(row)
- return sample
- def printBlocks(blocks):
- for block in blocks:
- print('--------BlockStart--------')
- for line in block:
- print(line)
- print('--------EndStart--------')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement