图像的DCT算法

匿名 (未验证) 提交于 2019-12-03 00:37:01

一,背景介绍
DCT,即离散余弦变换,常用图像压缩算法,步骤如下
1)分割,首先将图像分割成8x8或16x16的小块;
2)DCT变换,对每个小块进行DCT变换;
3)舍弃高频系数(AC系数),保留低频信息(DC系数)。高频系数一般保存的是图像的边界、纹理信息,低频信息主要是保存的图像中平坦区域信息。

二,图像
二维DCT变换就是将二维图像从空间域转换到频率域。形象的说,就是计算出图像由哪些二维余弦波构成

F=AfAT

A(i,j)=c(i)cos[(j+0.5)πNi]

其中F就是变换得到的系数,f是图像的像素值,A是转换矩阵,其中i为二维波的水平方向频率,j为二维波的垂直方向频率,取值范围都是0-(N-1),N是图像块的大小,

c(i)={1N,i=02N,i0

三,Matlab实现图像块DCT变换
clc;clear; f = (rand(4,4)*100); % 生成4x4块 for i=0:3     for j=0:3         if i == 0             c = sqrt(1/4);         else             c = sqrt(2/4);         end         A(i+1, j+1) = c * cos( (j + 0.5)* pi * i / 4 ); % 生成转换矩阵     end end  dct_my = A*f*A'; % 转换 dct_matlab = dct2(f); % matlab自带函数转换 

结果:

 f =     89.0903   14.9294   81.4285   19.6595    95.9291   25.7508   24.3525   25.1084    54.7216   84.0717   92.9264   61.6045    13.8624   25.4282   34.9984   47.3289   dct_my =    197.7977   21.3312    5.8547   40.7995    10.7399   48.3374   21.6041   46.3630   -34.4348  -18.4205    0.7236   18.6270    51.2061  -20.9533  -41.4148    8.2377   dct_matlab =    197.7977   21.3312    5.8547   40.7995    10.7399   48.3374   21.6041   46.3630   -34.4348  -18.4205    0.7236   18.6270    51.2061  -20.9533  -41.4148    8.2377  >> 

四,DCT反变换

F=AfAT

f=A1F(AT)1

A是正交矩阵,所以有AT=A1,所以求得:
f=ATFA

五,Matlab实现DCT反变换
基于前面得到的转换矩阵A,则DCT反转换后面加一行代码即可:f_convert=AFA
clc;clear; f = (rand(4,4)*100); % 生成4x4块 for i=0:3     for j=0:3         if i == 0             c = sqrt(1/4);         else             c = sqrt(2/4);         end         A(i+1, j+1) = c * cos( (j + 0.5)* pi * i / 4 );     end end  dct_my = A*f*A'; dct_matlab = dct2(f);  f_convert = A'*dct_my*A; 
 f =     22.8977   53.8342   10.6653   81.7303    91.3337   99.6135   96.1898   86.8695    15.2378    7.8176    0.4634    8.4436    82.5817   44.2678   77.4910   39.9783   dct_my =    204.8538    1.1802    9.6825   -7.4417    21.7177  -30.4859    8.3810  -50.0097     1.8694   -9.0912   10.7823   -3.4473  -121.8989  -10.6487   16.1003  -22.1974   dct_matlab =    204.8538    1.1802    9.6825   -7.4417    21.7177  -30.4859    8.3810  -50.0097     1.8694   -9.0912   10.7823   -3.4473  -121.8989  -10.6487   16.1003  -22.1974   f_convert =     22.8977   53.8342   10.6653   81.7303    91.3337   99.6135   96.1898   86.8695    15.2378    7.8176    0.4634    8.4436    82.5817   44.2678   77.4910   39.9783  >> 

六,对图像进行DCT变换
效果图:

将图像分成8x8的小块,对每个小块依次进行dct变换,反变换回来时,也是依次处理每个小块。
matlab代码:

clc;clear; img = rgb2gray(imread('D:\Code\Image\girl.jpg')); figure, imshow(img);   % 1,使图像行列为 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 figure, imshow(img_dct); % 显示生成的dct系数  % 3,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 figure,  imshow(mat2gray(new_img)); % 显示反变换回来的图像 

放大后的dct系数块组成的图像:

发现,每个小块的左上角,即一个DC系数,最亮,保存的是原图像低频信息;小块的其他地方,即63个AC系数,保存的是高频信息。对整个图像而言,背景区域是平坦区域,没有纹理信息,所以AC系数很小,而代表亮度信息的DC系数很大;头发区域不仅含有亮度信息,纹理信息也丰富,所以AC系数值很大。

文章来源: 图像的DCT算法
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!