資源簡介
我自己寫的,不好別罵。
代碼片段和文件信息
import?cv2
import?numpy?as?np
#?塊大小
Block_Size?=?8
#?保存上一個塊的DC系數
DC_y?=?0
DC_cr?=?0
DC_cb?=?0
#?zig?zag方向
right?=?0
down?=?1
right_up?=?2
left_down?=?3
#?亮度量化表
Luminance_Quantization_Table?=?[
????[16?11?10?16?24?40?51?61]
????[12?12?14?19?26?58?60?55]
????[14?13?16?24?40?57?69?56]
????[14?17?22?29?51?87?80?62]
????[18?22?37?56?68?109?103?77]
????[24?35?55?64?81?104?113?92]
????[49?64?78?87?103?121?120?101]
????[72?92?95?98?112?100?103?99]
]
#?色度量化表
Chrominance_Quantization_Table?=?[
????[17?18?24?47?99?99?99?99]
????[18?21?26?66?99?99?99?99]
????[24?26?56?99?99?99?99?99]
????[47?66?99?99?99?99?99?99]
????[99?99?99?99?99?99?99?99]
????[99?99?99?99?99?99?99?99]
????[99?99?99?99?99?99?99?99]
????[99?99?99?99?99?99?99?99]
]
def?quantize(block:?np.ndarray?flag:?int?=?0):
????res?=?np.zeros((Block_Size?Block_Size)?np.float32)
????if?flag:
????????#?色度量化
????????for?row?in?range(Block_Size):
????????????for?col?in?range(Block_Size):
????????????????res[row][col]?=?int(block[row][col]?/?Chrominance_Quantization_Table[row][col]?+?0.5)
????else:
????????#?亮度量化
????????for?row?in?range(Block_Size):
????????????for?col?in?range(Block_Size):
????????????????res[row][col]?=?int(block[row][col]?/?Luminance_Quantization_Table[row][col]?+?0.5)
????return?res
def?inverse_quantize(block:?np.ndarray?flag:?int?=?0):
????res?=?np.zeros((Block_Size?Block_Size)?np.float32)
????if?flag:
????????#?色度量化
????????for?row?in?range(Block_Size):
????????????for?col?in?range(Block_Size):
????????????????res[row][col]?=?int(block[row][col]?*?Chrominance_Quantization_Table[row][col]?+?0.5)
????else:
????????#?亮度量化
????????for?row?in?range(Block_Size):
????????????for?col?in?range(Block_Size):
????????????????res[row][col]?=?int(block[row][col]?*?Luminance_Quantization_Table[row][col]?+?0.5)
????return?res
def?encode(block:?np.ndarray?flag:?int):
????“““
????對塊進行DC差分編碼和AC行程編碼
????:param?block:
????:return:?兩個編碼結果
????“““
????global?DC_y?DC_cr?DC_cb
????res_code?=?[]
????#?DC差分編碼
????if?flag?==?0:
????????res_code.append(block[0][0]?-?DC_y)
????????DC_y?=?block[0][0]
????elif?flag?==?1:
????????res_code.append(block[0][0]?-?DC_cr)
????????DC_cr?=?block[0][0]
????elif?flag?==?2:
????????res_code.append(block[0][0]?-?DC_cb)
????????DC_cb?=?block[0][0]
????#?AC行程編碼
????zero_count?=?0
????#?zig?zag遍歷
????row?=?0
????col?=?1
????act?=?left_down
????while?row?!=?Block_Size?and?col?!=?Block_Size:
????????#?對當前數字進行處理
????????if?block[row][col]:
????????????res_code.append((zero_count?block[row][col]))
????????????zero_count?=?0
????????else:
????????????zero_count?+=?1
????????????if?zero_count?==?16:
????????????????res_code.append((15?0))
????????????????zero_count?=?0
????????????else:
????????????????if?row?==?Block_Size?-?1?and?col?==?Block_Size?-?1:
????????????????????res_code.append((zero_count?-?1?0))
????????#?迭代
????????if?act?==?right:
評論
共有 條評論