JPG压缩

JPEG或称JPG,是一种针对照片影像而广泛使用的有损压缩标准方法,由联合图像专家小组(英语:Joint Photographic Experts Group)开发。此团队创立于1986年,1992年发布了JPEG的标准而在1994年获得了ISO 10918-1的认定。当年发明这个的真是天才了。。。

该组织的主页:JPEG

先发一个python版本

JPEG压缩算法基于离散余弦变换(DCT)、量化和熵编码。以下是一个简单的JPEG压缩算法的示例代码,展示了压缩图像的基本过程。该代码基于Python和Pillow库,并利用了基本的DCT和量化。Pillow是Python中较为基础的图像处理库,主要用于图像的基本处理。

下面是一个python版本的例子,该例子只能处理灰度图哈,量化矩阵的选择会影响压缩质量和压缩比。

pip install numpy pillow

import numpy as np
from PIL import Image
from scipy.fftpack import dct, idct

# 读取图像
image = Image.open('input.jpg').convert('L')  # 转换为灰度图像
image_data = np.asarray(image, dtype=np.float32)

# 分块处理
def block_process(image_data, block_size=8):
    height, width = image_data.shape
    blocks = []
    for i in range(0, height, block_size):
        for j in range(0, width, block_size):
            block = image_data[i:i+block_size, j:j+block_size]
            if block.shape == (block_size, block_size):
                blocks.append(block)
    return blocks

# DCT变换
def apply_dct(blocks):
    dct_blocks = [dct(dct(block.T, norm='ortho').T, norm='ortho') for block in blocks]
    return dct_blocks

# 量化矩阵
quantization_matrix = np.array([
    [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]
])

# 量化
def quantize(blocks, quantization_matrix):
    quantized_blocks = [np.round(block / quantization_matrix) for block in blocks]
    return quantized_blocks

# 压缩图像
blocks = block_process(image_data)
dct_blocks = apply_dct(blocks)
quantized_blocks = quantize(dct_blocks, quantization_matrix)

# 反量化
def dequantize(blocks, quantization_matrix):
    dequantized_blocks = [block * quantization_matrix for block in blocks]
    return dequantized_blocks

# 逆DCT变换
def apply_idct(blocks):
    idct_blocks = [idct(idct(block.T, norm='ortho').T, norm='ortho') for block in blocks]
    return idct_blocks

dequantized_blocks = dequantize(quantized_blocks, quantization_matrix)
reconstructed_blocks = apply_idct(dequantized_blocks)

# 组合图像
def reconstruct_image(blocks, image_shape, block_size=8):
    height, width = image_shape
    reconstructed_image = np.zeros((height, width))
    idx = 0
    for i in range(0, height, block_size):
        for j in range(0, width, block_size):
            if reconstructed_image[i:i+block_size, j:j+block_size].shape == (block_size, block_size):
                reconstructed_image[i:i+block_size, j:j+block_size] = blocks[idx]
                idx += 1
    return reconstructed_image

reconstructed_image = reconstruct_image(reconstructed_blocks, image_data.shape)

# 保存重建的图像
reconstructed_image = np.clip(reconstructed_image, 0, 255).astype(np.uint8)
Image.fromarray(reconstructed_image).save('output.jpg')

代码说明
读取图像:使用Pillow库读取输入图像并将其转换为灰度图像。
分块处理:将图像分成8x8的块进行处理。
DCT变换:对每个块应用离散余弦变换(DCT)。
量化:使用量化矩阵对DCT系数进行量化。
反量化:对量化后的DCT系数进行反量化。
逆DCT变换:对反量化后的系数应用逆DCT变换。
组合图像:将处理后的块组合回原图像。

参考:

https://zh.wikipedia.org/wiki/JPEG

https://en.wikipedia.org/wiki/JPEG

JPEG原理概述

影像算法解析——JPEG 压缩算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值