【数字图像处理】【Matlab】【实验三】图像增强(2)


author:zox
实验环境:Matlab2019a


一、实验目的

  1. 理解并掌握直方图均衡化实现图像增强。
  2. 掌握傅里叶变换和离散余弦变换。

二、实验题目

  1. 对一幅分辨率低的图像采用直方图均衡化方法实现图像增强,分别采用系统函数和自己编写函数实现相应用功能。
  2. 对一幅图像分别进行傅里叶变换和离散余弦变换,并把傅里叶变换直流分量移到频谱中心。

三、实验内容

3.1 相关知识

1.直方图均衡化的过程

  灰度级直方图是图像的一种统计表达,它反映了该图中不同灰度级出现的统计概率。

  1. 直方图均衡化的过程如下:
  2. 首先,统计各灰度级 r k r_k rk的像素数目 n k n_k nk
  3. 计算各灰度级的概率 P r ( r k ) = n k n P_r\left(r_k\right)=\frac{n_k}{n} Pr(rk)=nnk;
  4. 计算累计分布直方图各项值 S k = ∑ j = 0 k n j n S_k=\sum_{j=0}^{k}\frac{n_j}{n} Sk=j=0knnj;
  5. 拓展取整 S k = i n t [ ( ( L − 1 ) − 0 ) ∗ S k + 0.5 ] S_k=int[\left(\left(L-1\right)-0\right)\ast S_k+0.5] Sk=int[((L1)0)Sk+0.5]
  6. 确定映射对应关系;
  7. 计算新的概率,即均衡化直方图;
  8. 得到均衡化后的输出数据;

  直方图均衡化是一种适应性很强的增强工具。对于具有相同内容而具有不同直方图的图像,经过直方图均衡化处理后可以得到视觉上相似的结果。

2.傅里叶变换

  傅立叶变换是一种常见的分析方法,傅立叶变换将满足一定条件的函数表示为一些函数的加权和(或者积分)。可以分为四个类别:

  1. 非周期连续性信号:对应于傅里叶变换,频域连续非周期
  2. 周期性连续性信号:对应于傅立叶级数,频域离散非周期
  3. 非周期离散信号:对应于 D T F T DTFT DTFT(离散时间傅立叶变换),频域连续周期
  4. 周期性离散信号:对应于 D F T DFT DFT(离散时间傅立叶变换),频域离散周期

  对图像进行傅里叶变换,也就是二维离散傅里叶变换,其公式如下:
F ( u , v ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( u x M + v y N ) F(u,v)=\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-j2π\left(\frac{ux}{M}+\frac{vy}{N}\right)} F(u,v)=x=0M1y=0N1f(x,y)ej2π(Mux+Nvy)
  而离散傅里叶逆变换为:
F ( x , y ) = 1 M N ∑ u = 0 M − 1 ∑ v = 0 N − 1 f ( u , v ) e − j 2 π ( u x M + v y N ) F(x,y)=\frac{1}{MN}\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}f(u,v)e^{-j2π\left(\frac{ux}{M}+\frac{vy}{N}\right)} F(x,y)=MN1u=0M1v=0N1f(u,v)ej2π(Mux+Nvy)
  经过傅里叶变换之后,可以获得原图像信号的频域分布情况,经过逆变换后又会恢复到原图像,但图像的灰度值发生了变化。二维傅里叶变换可以处理较为复杂的图像,快速傅里叶变换会使运算相对简单化,图像经过离散傅立叶变换会得到该图像的频谱图。图像经过傅立叶变换后,得到的是图像的频域。也就是频率成分。 这个频率成分表示的意义就是相邻像数之间数值(颜色,亮度等等)的变化,也就是说图像在空间上变化的越快,他对应在频域上的数值就越大。

3.离散余弦变换

  图像的离散余弦变换广泛用于图像的压缩。对原始图像进行离散余弦变换,变换后 D C T DCT DCT系数能量主要集中在左上角,其余大部分系数接近于零, D C T DCT DCT具有适用于图像压缩的特性。将变换后的 D C T DCT DCT系数进行门限操作,将小于一定值得系数归零,这就是图像压缩中的量化过程,然后进行逆 D C T DCT DCT运算,可以得到压缩后的图像。
  离散余弦变换的公式如下:
F ( u , v ) = 2 N ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) ⋅ c o s ( 2 x + 1 ) u π 2 N ⋅ c o s ( 2 y + 1 ) v π 2 N F(u,v)=\frac{2}{N}\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)·cos\frac{(2x+1)uπ}{2N}·cos\frac{(2y+1)vπ}{2N} F(u,v)=N2x=0M1y=0N1f(x,y)cos2N(2x+1)uπcos2N(2y+1)vπ

  离散余弦变换是先将整体图像分成 N ∗ N N*N NN像素块,然后对 N ∗ N N*N NN像素块逐一进行离散余弦变换。由于大多数图像的高频分量较小,相应于图像高频分量的系数经常为零,加上人眼对高频成分的失真不太敏感。所以可用更粗的量化。因此,传送变换系数的数码率要大大小于传送图像像素所用的数码率。到达接收端后通过反离散余弦变换回到样值。

4.实验中直接使用的函数

(1)imread(path)函数:从图像所在路径读取图像的数据信息存为矩阵。
(2)imshow(image)函数:将读取到的图像显示到figure中。
(3)subplot(m,n,p)函数
subplot函数是将多个图画到一个平面上的工具。其中m、n表示一个m行n列的大画框,可显示 m ∗ n m*n mn个图 ,p表示图所在位置。
(4)构造函数
function[输出形参]=函数名([输入形参])
函数体
(5)size()函数
[m,n] = size(X)
返回矩阵X的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。
(6)zeros(m,n)函数:产生 m ∗ n m*n mn的double类型零矩阵。
(7)double(x):增加数据的精度,使计算更加准确。
(8)floor():向下取整
(9)colorbar():画图像的灰度条
(10)fft():一维傅里叶变换
(11)dct2(I):%计算二维 D C T DCT DCT 变换
(12)idct2(J):重构图像

3.2 实验代码

【sy3.m】

clear all;close all;clc;
%% 1、对一幅分辨率低的图像采用直方图均衡化方法实现图像增强,分别采用系统函数和自己编写函数实现相应用功能。
I=imread('Fig0208(a).tif');            %读取一幅分辨率低的灰度图像
H=myhisteq(I);                         %直方图均衡化
figure,suptitle('自编写');             %Figure 1
subplot(131),imshow(I),axis on,title('原图(分辨率低)'); 
subplot(132),imshow(H),title('使用自编写的myhisteq变换后的图像');
subplot(133),myimhist(H),title('图像的直方图'); 
%对比测试
K=histeq(I,256);                       %histeq是实现直方图均衡的系统函数
figure,suptitle('系统函数');            %Figure 2
subplot(131),imshow(I),axis on,title('原图(分辨率低)') ; 
subplot(132),imshow(K),axis on,title('使用函数histeq变换后的图像');
subplot(133),imhist(K),title('图像的直方图') ; 
%% 2、对一幅图像分别进行傅里叶变换和离散余弦变换,并把傅里叶变换直流分量移到频谱中心。
I=imread('Fig0517(a).tif');
F=myfft2(I);          %傅里叶变换
A=sqrt(real(F).^2+imag(F).^2);
F1=(A-min(min(A)))/(max(max(A))-min(min(A)))*225;
F=myfftshift(F);      %将频谱图中零频率成分移动至频谱图中心
A=sqrt(real(F).^2+imag(F).^2);
F2=(A-min(min(A)))/(max(max(A))-min(min(A)))*225;
F3=real(ifft2(ifftshift(F)));  %频率域反变换到空间域,并取实部
F3=im2uint8(mat2gray(F3));    %更改图像类型
figure,suptitle('傅里叶变换');           %Figure 3
subplot(221),imshow(I),axis on,title('原图') ; 
subplot(222),imshow(F1),axis on,title('傅里叶变换频谱图');
subplot(223),imshow(F2),axis on,title('频移后的频谱图') ; 
subplot(224),imshow(F3),axis on,title('逆傅里叶变换');
J = dct2(I);%计算二维 DCT 变换、图像大部分能量集中在上左角处
J(abs(J)<0.1) = 0;%把变换矩阵中小于 10 的值置换为 0,对灰度矩阵进行量化
K = idct2(J)/255;%然后用 idct2 重构图像
figure,suptitle('离散余弦变换');          %Figure 4
subplot(131),imshow(I),axis on,title('原图') ; 
subplot(132),imshow(log(abs(J))),axis on,title('余弦变换系数');
subplot(133),imshow(K),title('余弦反变换恢复图像') ;

【myhisteq.m】

% 函数myhisteq:直方图均衡化(包括对彩色图像的处理)
% 输入参数:I:原图像
% 输出参数:OUT:处理后的图片数据
% 使用函数:size(I):求矩阵大小
%         double(I):增加精度计算更准确
%         floor():向下取整
%         myhisteq():画图像的频率分布直方图
function OUT = myhisteq(I)
%% 初始化数据
[x,y,m] = size(I);                      % 图像大小x*y
L = 256;                                % 灰度级256级
I = double(I);                          % 增加精度计算更准确
Result = zeros(L,5);                  % 定义处理过程相关数据的矩阵
if m==1                                 %当为灰度图像时
%% Result第一列:灰度级别
Result(1:L,1) = 0:L-1;          
%% Result第二列:不同灰度级别统计的数目
for c = 1:x                     
    for r = 1:y
        for k = 0:L-1  
            if ( I(c,r) == k)
                Result(k+1,2) =  Result(k+1,2) +1;
            end
        end
    end
end
%% Result第三列:不同灰度级别统计的概率
Result(1:L,3) = Result(1:L,2)/(x*y);
%% Result第四列:不同灰度级别累积分布
for k = 0:L-1                           
    for j = 1:k+1
        Result(k+1,4) = Result(k+1,4)+Result(j,3); 
    end
end
%% Result第五列:映射
Result(1:L,5) = floor(((L-1)-0)*Result(1:L,4)+0.5);
%% 得到均衡化的数据为:
J = zeros(r,c,1);
for c = 1:x                     
    for r = 1:y
        for k = 0:L-1  
            if ( I(c,r) == k)
                J(c,r) =  Result(k+1,5);
            end
        end
    end
end
%% 将均衡化的数据图像转换为灰度图像
OUT = im2uint8(mat2gray(J));
elseif m == 3                   %彩色图像均衡化
    OUT =I;
    R=I(:,:,1);%提取红色分量
    G=I(:,:,2);%提取绿色分量
    B=I(:,:,3);%提取蓝色分量  
    R=myhisteq(R);
    G=myhisteq(G);
    B=myhisteq(B);
    OUT(:,:,1)=R;
    OUT(:,:,2)=G;
    OUT(:,:,3)=B;
end
end

【myimhist.m】

% 函数myimhist:画图像的频率分布直方图(包括对彩色图像的处理)
% 输入参数:I:原图像
% 输出参数:OUT:处理后的图片数据
% 使用函数:size(I):求矩阵大小
%         double(I):增加精度计算更准确
%         colorbar():画图像的灰度条
%         zeros():建全0矩阵 
function OUT=myimhist(I)
[x,y,m] = size(I);                      % 图像大小x*y
L = 256;                                % 灰度级256级
I = double(I);                          % 增加精度计算更准确
Result = zeros(L,2);                    % 定义处理过程相关数据的矩阵
if m == 1
Result(1:L,1) = 0:L-1;                  %Result第一列:灰度级别 
for c = 1:x                     
    for r = 1:y
        for k = 0:L-1  
            if ( I(c,r) == k)
                Result(k+1,2) =  Result(k+1,2) +1;%Result第二列:不同灰度级别统计的数目
            end
        end
    end
end
OUT = Result(:,2);
elseif m == 3
    R=I(:,:,1);%提取红色分量
    G=I(:,:,2);%提取绿色分量
    B=I(:,:,3);%提取蓝色分量  
    Result(:,2) = myimhist(R) + myimhist(G) + myimhist(B);%RGB分量统计后相加
OUT = Result(:,2);
end
%% 显示
bar(0:L-1,Result(:,2),0.3,'r'),xlabel('灰度值'),ylabel('出现次数'),title('图像的直方图');
colormap gray;                                          %灰度条
c=colorbar('location','southoutside');caxis([0,255]);   %灰度条位置

【myfft2.m】

%  fft function;  
% 函数myfft2:二维离散傅里叶变换
% 输入参数:I:原图像
% 输出参数:F:处理后的图片数据
% 使用函数:size(I):求矩阵大小
%         ones():建全1矩阵 
%         im2double():双精度
%         fft():一维傅里叶变换
function F = myfft2(I)
I=im2double(I);
[x,y] = size(I);
Ax = ones(x,y);
ans = ones(x,y);
com = 0+1i;%虚部
% 对每一列进行DFT  
for m=1:y
	Ax(:,m) = fft(I(:,m));%一维傅里叶变换
end
% 对每一行进行DFT    
for k=1:x
	ans(k,:) = fft(Ax(k,:));
end
F=ans;
end

【myfftshift.m】

% 函数myfftshift:变换频谱中心
% 输入参数:I:原图像
% 输出参数:F:处理后的图片数据
% 使用函数:size(I):求矩阵大小
function A = myfftshift(I)
sz = ceil(size(I)/2);
A = I([sz(1)+1:end, 1:sz(1)], [sz(2)+1:end, 1:sz(2)]);
end

3.3 实验结果

在这里插入图片描述

图1 自编写函数实现直方图均衡化

在这里插入图片描述

图2 系统函数实现直方图均衡化

在这里插入图片描述

图3 傅里叶变换

在这里插入图片描述

图4 离散余弦变换

四、实验心得

  1. 自编写函数对图像进行均衡化观察结果图片的差别不大,但在图像数据上还是有细微差别的。
  2. 对原始图像进行离散余弦变换,由结果可知,变换后DCT系数能量主要集中在左上角,其余大部分系数接近于零,这说明DCT具有适用于图像压缩的特性。将变换后的DCT系数进行门限操作,将小于一定值得系数归零,这就是图像压缩中的量化过程,然后进行逆DCT运算,得到压缩后的图像。
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoxiii

越打赏越生长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值