要求:
- 灰度和彩色图像的离散余弦变换:问题1:对输入的灰度和彩色图像进行分块,每一块图像为8*8像素的大小。对分块图像进行离散余弦变换,输出频谱图(DCT系数); 问题2:尝试改变部分的DCT系数; 问题3:通过离散余弦逆变换,还原出图像,观察与原图像之间的区别。
1、问题及说明
(1)对输入的灰度和彩色图像进行分块,每一块图像为8*8像素的大小。对分块图像进行离散余弦变换,输出频谱图(DCT系数);
(2)尝试改变部分的DCT系数;
(3)通过离散余弦逆变换,还原出图像,观察与原图像之间的区别;
离散余弦变化-DCT的应用之一是:经常被信号处理和图像处理使用,用于对信号和图像进行有损数据压缩。这是因为DCT具有很强的“能量集中”特性。
2、效果展示
(1)输出频谱图
(3)逆变换
3、实验结果分析
对于比较平滑的图像/数据,DCT变换数据集中在图像的左上角。
对于细节丰富的图像/数据,DCT变化后的数据仍然比较集中,而且从频率谱恢复原始图像,有着不错的效果。
4、完整代码
(1)
clc;clear;
RGB=imread('girl.tiff');
gary=rgb2gray(RGB);
m=0.5*[ 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];
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
IR = double(R);
IG = double(G);
IB = double(B);
%建立8*8的DCT变换矩阵
T=dctmtx(8);
%DCT变换
RR = blkproc(IR,[8,8],'P1*x*P2',T,T');
GG = blkproc(IG,[8,8],'P1*x*P2',T,T');
BB = blkproc(IB,[8,8],'P1*x*P2',T,T');
D1=blkproc(gary,[8 8],'dct2');
D2=cat(3,RR,GG,BB);
subplot(2,2,1);imshow(RGB);title('彩色图像')
subplot(2,2,2);imshow(log(abs(D2)));title('彩色图像分块DCT频谱图')
subplot(2,2,3);imshow(gary);title('灰度图')
subplot(2,2,4);imshow(log(abs(D1)));title('灰度图分块DCT频谱图')
(3)
灰色:
clc;
clear;
img = rgb2gray(imread('girl.tiff'));
% 使图像行列为 8的倍数
[row,col] = size(img);
row = round(row/8) * 8;
col = round(col/8) * 8;
img = imresize(img, [row, col]);
% 2对图像块进行dct变换
img_dct = zeros(row, col); % 存放转换后的dct系数
for i=1:8:row-7
for j=1:8:col-7
img_block = img(i:i+7, j:j+7);
dct_block = dct2(img_block); % 也可用刚才实现的(定义成一个函数即可)
% imshow(dct_block); % 显示dct块
img_dct(i:i+7, j:j+7) = dct_block;
end
end
% dct反变换
new_img = zeros(row,col);
for i=1:8:row-7
for j=1:8:col-7
dct_block = img_dct(i:i+7, j:j+7);
img_block = idct2(dct_block); % 也可用刚才实现的(定义成一个函数即可)
new_img(i:i+7, j:j+7) = img_block;
end
end
subplot(1,3,1);imshow(img);title('orgin')
subplot(1,3,2);imshow(img_dct);title('频谱图')
subplot(1,3,3);imshow(mat2gray(new_img));title('逆变换')
彩色:
clc;
clear;
x = imread('girl.tiff');
x = imresize(x,1/2);
xx = x;
% xx = rgb2gray(xx);
subplot(1,3,1);
imshow(xx);
imr = xx(:,:,1);
img = xx(:,:,2);
imb = xx(:,:,3);
[c,r] = size(imr);
Ar = zeros(c/8,r/8,8,8);
Ag = zeros(c/8,r/8,8,8);
Ab = zeros(c/8,r/8,8,8);
Br = zeros(c,r);
Bg = zeros(c,r);
Bb = zeros(c,r);
imgr = zeros(c,r);
imgg = zeros(c,r);
imgb = zeros(c,r);
for i=1:c/8
for j=1:r/8
Ar(i,j,:,:) = dct2(imr((i-1)*8+1:i*8,(j-1)*8+1:j*8));
Br((i-1)*8+1:i*8,(j-1)*8+1:j*8) = Ar(i,j,:,:);
Ag(i,j,:,:) = dct2(img((i-1)*8+1:i*8,(j-1)*8+1:j*8));
Bg((i-1)*8+1:i*8,(j-1)*8+1:j*8) = Ag(i,j,:,:);
Ab(i,j,:,:) = dct2(imb((i-1)*8+1:i*8,(j-1)*8+1:j*8));
Bb((i-1)*8+1:i*8,(j-1)*8+1:j*8) = Ab(i,j,:,:);
end
end
Tr = log(abs(Br)+1);
Tg = log(abs(Bg)+1);
Tb = log(abs(Bb)+1);
subplot(1,3,2);
imshow(cat(3,Tr,Tg,Tb),[])
for i=1:c
for j=1:r
if Tr(i,j)<3
Br(i,j)=0;
end
if Tg(i,j)<4
Bg(i,j)=0;
end
if Tb(i,j)<4
Bb(i,j)=0;
end
end
end
for i=1:c/8
for j=1:r/8
imgr((i-1)*8+1:i*8,(j-1)*8+1:j*8) = idct2(Br((i-1)*8+1:i*8,(j-1)*8+1:j*8));
imgg((i-1)*8+1:i*8,(j-1)*8+1:j*8) = idct2(Bg((i-1)*8+1:i*8,(j-1)*8+1:j*8));
imgb((i-1)*8+1:i*8,(j-1)*8+1:j*8) = idct2(Bb((i-1)*8+1:i*8,(j-1)*8+1:j*8));
end
end
subplot(1,3,3);
T= cat(3,uint8(imgr),uint8(imgg),uint8(imgb));
imshow(T)