图像编码压缩matlab代码
时间: 2023-12-01 14:42:30 浏览: 103
以下是两种图像编码压缩的Matlab代码:
1. 哈夫曼编码的Matlab代码无损图像压缩
```matlab
% HuffmanImageCoding.m接收要压缩的图像的输入,然后使用霍夫曼编码压缩文件,并返回压缩后的文件。
function HuffmanImageCoding(inputImage)
% 读取输入图像
I = imread(inputImage);
% 将图像转换为灰度图像
if size(I,3) == 3
I = rgb2gray(I);
end
% 获取图像大小
[rows, cols] = size(I);
% 将图像转换为一维数组
I = I(:);
% 计算每个像素值的出现次数
counts = hist(double(I), 0:255);
% 使用Huffman编码压缩图像
dict = huffmandict(0:255, counts/numel(I));
comp = huffmanenco(I, dict);
% 将压缩后的数据写入文件
fid = fopen('compressed.dat', 'w');
fwrite(fid, comp, 'ubit1');
fclose(fid);
% 读取压缩后的数据
fid = fopen('compressed.dat', 'r');
comp = fread(fid);
fclose(fid);
% 使用Huffman解码重建图像
I2 = huffmandeco(comp, dict);
I2 = reshape(I2, rows, cols);
% 显示原始图像和重建图像
figure, imshow(I);
figure, imshow(I2);
end
```
2. JPEG压缩的Matlab代码
```matlab
% JPEG_gray MATLAB实现,只针对灰度图像进行JPEG压缩,没有进行熵编码,只做理论上的压缩率计算
function JPEG_gray(inputImage)
% 读取输入图像
I = imread(inputImage);
% 将图像转换为灰度图像
if size(I,3) == 3
I = rgb2gray(I);
end
% 获取图像大小
[rows, cols] = size(I);
% 将图像分成8x8的块
blocks = mat2cell(I, 8*ones(1,rows/8), 8*ones(1,cols/8));
% 对每个块进行离散余弦变换(DCT)
dctBlocks = cellfun(@dct2, blocks, 'UniformOutput', false);
% 对每个块进行量化
quantizedBlocks = cellfun(@quantize, dctBlocks, 'UniformOutput', false);
% 对每个块进行反量化
dequantizedBlocks = cellfun(@dequantize, quantizedBlocks, 'UniformOutput', false);
% 对每个块进行反离散余弦变换(IDCT)
idctBlocks = cellfun(@idct2, dequantizedBlocks, 'UniformOutput', false);
% 将块合并成图像
I2 = cell2mat(idctBlocks);
% 显示原始图像和压缩后的图像
figure, imshow(I);
figure, imshow(I2);
end
% 量化函数
function quantizedBlock = quantize(dctBlock)
quantizationMatrix = [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];
quantizedBlock = round(dctBlock ./ quantizationMatrix);
end
% 反量化函数
function dequantizedBlock = dequantize(quantizedBlock)
quantizationMatrix = [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];
dequantizedBlock = quantizedBlock .* quantizationMatrix;
end
```
阅读全文