数字图像处理(六)频域增强-灰度和彩色图像的离散余弦变换+matlab

要求:

  • 灰度和彩色图像的离散余弦变换:问题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)

 

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值