author:zox
实验环境:Matlab2019a
图像增强(2)
一、实验目的
- 理解并掌握直方图均衡化实现图像增强。
- 掌握傅里叶变换和离散余弦变换。
二、实验题目
- 对一幅分辨率低的图像采用直方图均衡化方法实现图像增强,分别采用系统函数和自己编写函数实现相应用功能。
- 对一幅图像分别进行傅里叶变换和离散余弦变换,并把傅里叶变换直流分量移到频谱中心。
三、实验内容
3.1 相关知识
1.直方图均衡化的过程
灰度级直方图是图像的一种统计表达,它反映了该图中不同灰度级出现的统计概率。
- 直方图均衡化的过程如下:
- 首先,统计各灰度级 r k r_k rk的像素数目 n k n_k nk;
- 计算各灰度级的概率 P r ( r k ) = n k n P_r\left(r_k\right)=\frac{n_k}{n} Pr(rk)=nnk;
- 计算累计分布直方图各项值 S k = ∑ j = 0 k n j n S_k=\sum_{j=0}^{k}\frac{n_j}{n} Sk=∑j=0knnj;
- 拓展取整 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[((L−1)−0)∗Sk+0.5];
- 确定映射对应关系;
- 计算新的概率,即均衡化直方图;
- 得到均衡化后的输出数据;
直方图均衡化是一种适应性很强的增强工具。对于具有相同内容而具有不同直方图的图像,经过直方图均衡化处理后可以得到视觉上相似的结果。
2.傅里叶变换
傅立叶变换是一种常见的分析方法,傅立叶变换将满足一定条件的函数表示为一些函数的加权和(或者积分)。可以分为四个类别:
- 非周期连续性信号:对应于傅里叶变换,频域连续非周期
- 周期性连续性信号:对应于傅立叶级数,频域离散非周期
- 非周期离散信号:对应于 D T F T DTFT DTFT(离散时间傅立叶变换),频域连续周期
- 周期性离散信号:对应于 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=0∑M−1y=0∑N−1f(x,y)e−j2π(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=0∑M−1v=0∑N−1f(u,v)e−j2π(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=0∑M−1y=0∑N−1f(x,y)⋅cos2N(2x+1)uπ⋅cos2N(2y+1)vπ
离散余弦变换是先将整体图像分成 N ∗ N N*N N∗N像素块,然后对 N ∗ N N*N N∗N像素块逐一进行离散余弦变换。由于大多数图像的高频分量较小,相应于图像高频分量的系数经常为零,加上人眼对高频成分的失真不太敏感。所以可用更粗的量化。因此,传送变换系数的数码率要大大小于传送图像像素所用的数码率。到达接收端后通过反离散余弦变换回到样值。
4.实验中直接使用的函数
(1)imread(path)函数:从图像所在路径读取图像的数据信息存为矩阵。
(2)imshow(image)函数:将读取到的图像显示到figure中。
(3)subplot(m,n,p)函数
subplot函数是将多个图画到一个平面上的工具。其中m、n表示一个m行n列的大画框,可显示
m
∗
n
m*n
m∗n个图 ,p表示图所在位置。
(4)构造函数
function[输出形参]=函数名([输入形参])
函数体
(5)size()函数
[m,n] = size(X)
返回矩阵X的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。
(6)zeros(m,n)函数:产生
m
∗
n
m*n
m∗n的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 实验结果
四、实验心得
- 自编写函数对图像进行均衡化观察结果图片的差别不大,但在图像数据上还是有细微差别的。
- 对原始图像进行离散余弦变换,由结果可知,变换后DCT系数能量主要集中在左上角,其余大部分系数接近于零,这说明DCT具有适用于图像压缩的特性。将变换后的DCT系数进行门限操作,将小于一定值得系数归零,这就是图像压缩中的量化过程,然后进行逆DCT运算,得到压缩后的图像。