• 大小: 9KB
    文件类型: .py
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: Python
  • 标签: opencv  

资源简介

我自己写的,不好别骂。

资源截图

代码片段和文件信息

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:

评论

共有 条评论