图像压缩matlab代码
时间: 2023-11-25 17:52:32 浏览: 42
以下是一个使用MATLAB进行图像压缩的例子,其中使用了无损压缩方法中的行程编码压缩:
```matlab
% 读入图像
I = imread('lena1.jpg');
% 灰度化
I1 = rgb2gray(I);
% 将原图转换为二值图像,阈值为0.5
I3 = im2bw(I1, 0.5);
% 将原始图像写成一维的数据并设为I2
I2 = I1(:);
% 计算I2的长度
I2length = length(I2);
% 令X为新建的二值图像的一维数据组
X = I3(:);
% 行程编码压缩
count = 1;
for i = 1:L-1
if X(i) == X(i+1)
count = count + 1;
else
RLE(count, 1) = X(i);
RLE(count, 2) = count;
count = 1;
end
end
RLE(count, 1) = X(L);
RLE(count, 2) = count;
% 输出压缩后的结果
disp(RLE);
```
需要注意的是,这只是一个简单的例子,实际的图像压缩方法要比这个复杂得多。如果您需要更高效的图像压缩方法,建议使用专业的图像处理软件或库。
相关问题
jpeg图像压缩matlab代码
以下是一个简单的 JPEG 图像压缩 Matlab 代码示例,该代码适用于灰度图像。
```matlab
% 读取图像
img = imread('image.jpg');
img = im2double(img);
% 设置量化矩阵
Q = [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];
% 分块大小
N = 8;
% 计算 DCT 系数
dct_coef = zeros(size(img));
for i = 1:N:size(img,1)
for j = 1:N:size(img,2)
block = img(i:i+N-1,j:j+N-1);
dct_coef(i:i+N-1,j:j+N-1) = dct2(block);
end
end
% 量化 DCT 系数
quant_coef = round(dct_coef ./ (Q * N));
% 反量化 DCT 系数
dct_coef = quant_coef .* (Q * N);
% 重构图像
reconstructed_img = zeros(size(img));
for i = 1:N:size(reconstructed_img,1)
for j = 1:N:size(reconstructed_img,2)
block = idct2(dct_coef(i:i+N-1,j:j+N-1));
reconstructed_img(i:i+N-1,j:j+N-1) = block;
end
end
% 显示原图像和压缩后的图像
figure; imshow(img); title('Original Image');
figure; imshow(reconstructed_img); title('Compressed Image');
```
该代码将图像分成 $8 \times 8$ 的块,对每个块进行离散余弦变换 (DCT),然后使用 JPEG 标准中的量化矩阵进行量化。反量化后,使用逆离散余弦变换 (IDCT) 重构图像。最后,该代码显示原始图像和压缩后的图像。
JPEG彩色图像压缩matlab代码
以下是一段使用MATLAB实现JPEG彩色图像压缩的代码:
```matlab
% 读取彩色图像
img = imread('test.jpg');
% 将图像转换为YCbCr颜色空间
img_ycbcr = rgb2ycbcr(img);
% 对Y、Cb、Cr三个通道分别进行DCT变换
dct_y = dct2(img_ycbcr(:,:,1));
dct_cb = dct2(img_ycbcr(:,:,2));
dct_cr = dct2(img_ycbcr(:,:,3));
% 对DCT系数进行量化
quant_y = round(dct_y ./ [16 11 10; 10 16 11; 10 11 16]);
quant_cbcr = round(dct_cb ./ [17 18 24; 21 26 66; 24 56 99]);
% 对量化后的DCT系数进行熵编码
huff_y = huffmanenco(quant_y(:), huffmandict([0:255], [1:256]));
huff_cbcr = huffmanenco(quant_cbcr(:), huffmandict([0:255], [1:256]));
% 将压缩后的数据保存到文件中
save('compressed.mat', 'huff_y', 'huff_cbcr');
% 从文件中读取压缩后的数据
load('compressed.mat', 'huff_y', 'huff_cbcr');
% 对压缩后的数据进行解码
quant_y_dec = reshape(huffmandeco(huff_y, huffmandict([0:255], [1:256])), [3 3 size(dct_y)]);
quant_cbcr_dec = reshape(huffmandeco(huff_cbcr, huffmandict([0:255], [1:256])), [3 3 size(dct_cb)]);
% 对解码后的量化系数进行反量化
dct_y_dec = quant_y_dec .* [16 11 10; 10 16 11; 10 11 16];
dct_cbcr_dec = quant_cbcr_dec .* [17 18 24; 21 26 66; 24 56 99];
% 对反量化后的DCT系数进行反DCT变换
img_ycbcr_dec(:,:,1) = idct2(dct_y_dec);
img_ycbcr_dec(:,:,2) = idct2(dct_cbcr_dec);
img_ycbcr_dec(:,:,3) = idct2(dct_cr);
% 将图像从YCbCr颜色空间转换回RGB颜色空间
img_dec = ycbcr2rgb(img_ycbcr_dec);
% 显示压缩前后的图像
subplot(1, 2, 1);
imshow(img);
title('Original Image');
subplot(1, 2, 2);
imshow(img_dec);
title('Decompressed Image');
```
该代码将彩色图像转换为YCbCr颜色空间,对Y、Cb、Cr三个通道分别进行DCT变换,然后对DCT系数进行量化和熵编码,最后将压缩后的数据保存到文件中。解压缩时,先从文件中读取压缩后的数据,然后对数据进行解码、反量化和反DCT变换,最后将图像从YCbCr颜色空间转换回RGB颜色空间。