首页 > 其他分享 >DCT图像变换

DCT图像变换

时间:2022-12-06 14:46:05浏览次数:42  
标签:系数 img 变换 图像 DCT dct

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

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

 

 

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

 

 

 1)求出转换矩阵A;
2)利用转换矩阵A,转换到频域,即由图像 f 得到系数矩阵F。

三,Matlab实现图像块DCT变换

clc;clear;
f = (rand(4,4)*100); % 生成4x4块
% 1,根据公式,生成转换矩阵A
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

% 2,利用转换矩阵A,进行转换
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反变换

 

 

五,Matlab实现DCT反变换
基于前面得到的转换矩阵A,则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);

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变换
效果图,分别是原图,所有dct系数小块组成图,反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系数块组成的图像:


 

 

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

七,不分块,直接对整个图像DCT变换

clc;clear;
img = rgb2gray(imread('D:\Code\Image\girl.jpg'));
figure, imshow(img); 

% 1,对整个图像dct变换
dct_img = dct2(img);
figure, imshow(log(abs(dct_img)), colormap(gray(5)));
colorbar;

% 2,量化, 使得矩阵中小于0.1的值置为0,变得稀疏
dct_img(abs(dct_img)<0.1)=0; 

% 3,反变换回来
new_img = idct2(dct_img);
new_img = mat2gray(new_img);
figure, imshow(new_img);  

  效果图,分别是原图、整个图像变换后系数图、反变换得到的图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:系数,img,变换,图像,DCT,dct
From: https://www.cnblogs.com/fengliu-/p/16955158.html

相关文章

  • 本科课程【数字图像处理】实验1 - 腐蚀与膨胀
    大家好,我是【1+1=王】,热爱java的计算机(人工智能)渣硕研究生在读。如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!Goodbetterbest,neverletitrest,un......
  • 图像处理技术OpencvSharp入门
    目录第一部分初识Opencv1.C#下Opencv库2.安装OpenCvSharp第二部分OpencvSharp入门1.加载图像文件2.显示图像第三部分基础应用1.颜色转换2.尺寸调整3.二值化......
  • 利用傅立叶变换进行图像处理的代码演示
    前面有篇文件介绍过使用DCT(离散余弦)变换进行图像处理的例子:方法和思路: 关于傅立叶变换的实践,可以参考这篇文章:代码演示:高频滤波操作:#-*-coding:utf-8-*-importnumpyimpo......
  • 验证darknet中前处理做图像缩放(双线性内插值法)scale的算法效果
    ​​DARKNET中使用的缩放算法是双线性内插值法,这里就实际验证一把DARKNET中scale的工作原理与效果:首先这是一张原图,画面中的是南京明城墙玄武门,玄武湖的正门。18年国庆带娃......
  • 【图像处理笔记】总目录
    1图像增强1.1图像增强 2形态学2.1 二值图像形态学2.2 灰度级形态学2.3 形态学重建 3图像分割3.1 图像分割之基于灰度不连续性的分割方法......
  • 李永乐 傅里叶变换
    傅里叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。B站首发!草履虫都能看懂的【傅里叶变换】讲解,清华大学李永乐老师......
  • OpenCV3图像处理笔记
    此笔记针对Python版本的opencv3,c++版本的函数和python版本的函数参数几乎一样,只是矩阵格式从ndarray类型变成适合c++的mat模板类型。注意,因为python版本的o......
  • 5.6 函数y=Asin(ωx+φ)的图像和性质
    \({\color{Red}{欢迎到学科网下载资料学习}}\)【基础过关系列】2022-2023学年高一数学上学期同步知识点剖析精品讲义(人教A版2019)\({\color{Red}{跟贵哥学数学,so\qua......
  • 5.5.2 简单的三角恒等变换
    \({\color{Red}{欢迎到学科网下载资料学习}}\)【基础过关系列】2022-2023学年高一数学上学期同步知识点剖析精品讲义(人教A版2019)\({\color{Red}{跟贵哥学数学,so\qua......
  • 基于FPGA的图像拼接处理卡
    板卡介绍主要功能是实现对6路输入视频信号经过FPGA缩放后,叠加到一路视频中,并通过VGA接口和DVI接口同时显示叠加后的视频。输出可以是任意输入视频的四画面拼接,也可以是任意......