给我写一段用DCT实现图像压缩的matlab代码
时间: 2024-03-21 10:44:10 浏览: 30
以下是一个基于DCT的图像压缩Matlab代码示例:
```matlab
% 读入需要压缩的图像
img = imread('lena.png');
[m, n] = size(img);
% 设置压缩比
ratio = 0.5;
% 计算需要保留的系数数
num_coeffs = round(m * n * ratio);
% 对图像进行DCT变换
dct_img = dct2(img);
% 将DCT系数按大小排序,并仅保留前num_coeffs个系数
sorted_coeffs = sort(abs(dct_img(:)), 'descend');
thresh = sorted_coeffs(num_coeffs);
dct_img(abs(dct_img) < thresh) = 0;
% 对DCT系数进行逆变换,得到压缩后的图像
compressed_img = idct2(dct_img);
% 显示压缩前后的图像
subplot(1,2,1);
imshow(img);
title('Original Image');
subplot(1,2,2);
imshow(compressed_img);
title(['Compressed Image (', num2str(round(ratio*100)), '%)']);
```
这段代码会读入一个名为"lena.png"的图像,对其进行DCT变换,然后按照设定的压缩比例保留前num_coeffs个系数,并将其余系数置为0。最后对变换后的系数进行逆变换,得到压缩后的图像。
相关问题
灰度图实现压缩比为8:1的dct压缩MATLAB代码
以下是实现灰度图8:1 DCT压缩的MATLAB代码:
```matlab
% 读取灰度图像
img = imread('gray_image.jpg');
[m, n] = size(img);
% 将图像分成8*8的小块
blocks = mat2cell(img, 8*ones(1, m/8), 8*ones(1, n/8));
% 对每个小块进行DCT变换
dct_blocks = cellfun(@(block) dct2(block), blocks, 'UniformOutput', false);
% 对每个小块进行量化
quantization_table = [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];
quantization_blocks = cellfun(@(block) round(block./quantization_table), dct_blocks, 'UniformOutput', false);
% 将量化后的小块串联成一个向量
quantization_vector = cell2mat(reshape(quantization_blocks, 1, []));
% 从量化后的向量中取出8:1部分进行压缩
compressed_quantization_vector = quantization_vector(1:8:end);
% 将压缩后的向量还原成量化后的小块
compressed_quantization_blocks = mat2cell(compressed_quantization_vector, ones(1, numel(compressed_quantization_vector)/64)*64, 1);
% 对每个小块进行逆量化
dequantization_blocks = cellfun(@(block) block.*quantization_table, compressed_quantization_blocks, 'UniformOutput', false);
% 对每个小块进行逆DCT变换
decompressed_blocks = cellfun(@(block) idct2(block), dequantization_blocks, 'UniformOutput', false);
% 将小块拼接成原始图像
decompressed_img = cell2mat(decompressed_blocks);
% 将像素值限制在0-255范围内
decompressed_img(decompressed_img < 0) = 0;
decompressed_img(decompressed_img > 255) = 255;
decompressed_img = uint8(decompressed_img);
% 显示压缩前后的图像
subplot(1, 2, 1);
imshow(img);
title('原始图像');
subplot(1, 2, 2);
imshow(decompressed_img);
title('压缩后解压缩图像');
```
这段代码将原始灰度图像分成8x8大小的小块,对每个小块进行DCT变换,然后进行量化。接着将量化后的小块串联成一个向量,从中取出8:1部分进行压缩。然后将压缩后的向量还原成量化后的小块,对每个小块进行逆量化和逆DCT变换,最后将小块拼接成原始图像。
用matlab写一段dct算法
以下是一个简单的Matlab程序,演示了如何实现DCT算法:
```matlab
% 原始图像文件名
filename = 'lena.bmp';
% 读入原始图像
I = imread(filename);
% 将原始图像转换为灰度图像
if size(I,3) == 3
I = rgb2gray(I);
end
% 将图像分成8x8的块,进行DCT变换
dctI = zeros(size(I));
for i = 1:8:size(I,1)
for j = 1:8:size(I,2)
dctI(i:i+7,j:j+7) = dct2(I(i:i+7,j:j+7));
end
end
% 将DCT系数量化,只保留最高的k个系数,其他系数置为0
k = 200;
dctQ = zeros(size(I));
for i = 1:8:size(I,1)
for j = 1:8:size(I,2)
dctBlock = dctI(i:i+7,j:j+7);
dctSort = sort(abs(dctBlock(:)), 'descend');
threshold = dctSort(k);
dctBlock(abs(dctBlock) < threshold) = 0;
dctQ(i:i+7,j:j+7) = dctBlock;
end
end
% 将量化后的DCT系数进行反变换,得到量化后的图像
IQ = zeros(size(I));
for i = 1:8:size(I,1)
for j = 1:8:size(I,2)
IQ(i:i+7,j:j+7) = idct2(dctQ(i:i+7,j:j+7));
end
end
% 将结果保存到文件中
imwrite(uint8(IQ), 'lena_dct_quantized.bmp');
```
这个程序首先读入原始图像,将原始图像转换为灰度图像。然后将原始图像分成8x8的块,进行DCT变换。接着将DCT系数量化,只保留最高的k个系数,其他系数置为0。然后将量化后的DCT系数进行反变换,得到量化后的图像,最后将结果保存到文件中。
需要注意的是,DCT系数的量化阈值threshold和保留的系数个数k的取值应该根据实际情况进行调整,不同的取值会影响图像的质量和压缩比。