matlab
% 读取原始图像
originalImage = imread(‘input_image.jpg’);
originalImage = im2double(originalImage);
% 设置压缩参数
blockSize = 8; % DCT块大小
compressionRatio = 0.5; % 压缩比例
% 将图像分成不重叠的块
[h, w] = size(originalImage);
numBlocksH = floor(h / blockSize);
numBlocksW = floor(w / blockSize);
numBlocks = numBlocksH * numBlocksW;
% 初始化压缩后的图像和峰值信噪比
compressedImage = zeros(h, w);
psnr = 0;
% 对每个块进行DCT变换和量化
for i = 1:numBlocksH
for j = 1:numBlocksW
% 提取当前块
block = originalImage((i-1)blockSize+1:iblockSize, (j-1)blockSize+1:jblockSize);
% 进行DCT变换
dctBlock = dct2(block);
% 量化
quantizedBlock = round(dctBlock / compressionRatio);
% 反量化
dequantizedBlock = quantizedBlock * compressionRatio;
% 反DCT变换
compressedBlock = idct2(dequantizedBlock);
% 更新压缩后的图像和峰值信噪比
compressedImage((i-1)*blockSize+1:i*blockSize, (j-1)*blockSize+1:j*blockSize) = compressedBlock;
psnr = psnr + 10 * log10(1 / mean((block(:) - compressedBlock(:)).^2));
end
end
% 计算平均峰值信噪比
psnr = psnr / numBlocks;
% 显示原始图像和压缩后的图像
figure;
subplot(1, 2, 1);
imshow(originalImage);
title(‘原始图像’);
subplot(1, 2, 2);
imshow(compressedImage);
title(‘压缩后的图像’);
% 显示峰值信噪比
disp([‘压缩后的图像的PSNR:’, num2str(psnr), ’ dB’]);