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