数字图像处理:实验三 图像增强

实验三 图像增强

图像增强是数字图像处理过程中常采用的一种方法。为了改善视觉效果或便于人和机器对图像的理解和分析,根据图像的特点或存在的问题采取的改善方法或加强特征的措施称为图像增强。图像增强处理是改变图像视觉效果的手段,增强后的图像便于对它的后续处理。图像增强即可在空域中完成,也可在频率域中完成。

一、实验目的

(1)了解图像增强的意义和目的;
(2)掌握图像的灰度变换增强;
(3)基于直方图的图像增强方法;
(4)掌握图像平滑方法;
(5)掌握图像锐化方法。
(6)进一步巩固Matlab程序设计方法;
(7)编程实现图像增强并观察增强效果

二、实验原理

图像增强的Matlab实现,是利用图像处理软件对给出的图像进行处理。
1.灰度变换增强是一种点运算,可以使图像动态范围增大,扩展图像对比度,使图像变得清晰、特征明显。Matlab中可采用imadjust()函数实现图像灰度变换。
2.基于直方图的图像增强通过修改图像的灰度直方图达到图像增强的目的,也是一种点运算。Matlab中,imhist()函数计算并产生图像的直方图,histeq()函数是实现图像直方图均衡化的函数。
3.图像的平滑处理
为了抑制噪声改善图像质量所做的处理称为图像平滑或去噪,既可在空间域中进行,也可在频率域中进行。用于图像平滑处理的主要技术有空域中的邻域运算和频域中的低通滤波。邻域运算采用模板完成。
图像空间域平滑处理中最常用的是均值平滑和中值滤波。
(1)均值平滑
用窗口像素的平均值取代中心像素原来的灰度值。常用的邻域有4-邻域和8-邻域。
g(i,j)=1/k ∑_(m,n∈s)〖f(m,n)〗
借助模板卷积运算完成。去噪效果与模板尺寸有关。
(2)中值滤波
中值滤波是将模板中的元素由小到大进行排列,选取中间值代替模板中心对应元素作为输出值。中值滤波借助模板排序完成。中值滤波去除椒盐噪声效果好。模板大小一般为奇数,去噪效果与模板尺寸有关。
4.图像的锐化处理
图像锐化处理也是改善图像视觉效果的手段,同时能对图像的轮廓或边缘进行增强。用于图像锐化处理的主要技术有空域中的邻域运算和频域中的高通滤波。
图像锐化常采用一阶微分、二阶微分实现对边缘、细节等的突出。常采用的一阶微分算子包括梯度算子、robert算子、prewitt算子、sobel算子,二阶微分算子有拉普拉斯算子。图像锐化也可在频率域中利用高通滤波器完成。

三、实验仪器及设备

计算机、Matlab图像处理软件、待处理图像

四、实验内容及步骤

1.图像增强的点运算
(1)熟悉相关函数的用法利用格式:help函数名 掌握下列函数的使用方法

imhist----显示图像的直方图
ThisMATLABfunctioncalculatesthehistogramfortheintensityimageIand
displaysaplotofthehistogram.

imhist(I)
imhist(I,n)
imhist(X,map)
[counts,binLocations]=imhist(I)
[counts,binLocations]=imhist(gpuarrayI,___)
imadjust----调整图像的灰度值或色彩图
J=imadjust(I)
J=imadjust(I,[LOW_IN;HIGH_IN],[LOW_OUT;HIGH_OUT])
J=imadjust(I,[LOW_IN;HIGH_IN],[LOW_OUT;HIGH_OUT],GAMMA)
NEWMAP=imadjust(MAP,[LOW_IN;HIGH_IN],[LOW_OUT;HIGH_OUT],GAMMA)

histeq---利用直方图均衡化幅强图像的对比度
histeqenhancesthecontrastofimagesbytransformingthevaluesinan
intensityimage,orthevaluesinthecolormapofanindexedimage,so
thatthehistogramoftheoutputimageapproximatelymatchesaspecified
histogram.

J=histeq(I,HGRAM)
J=histeq(I,N)
[J,T]=histeq(I)
NEWMAP=histeq(X,MAP,HGRAM)
NEWMAP=histeq(X,MAP)
[NEWMAP,T]=histeq(X,...)

(2)编程实现对图像pout.tif的增强,观察增强效果

(a)读入图像,使用imhist()函数产生图像的直方图,分析它的直方图分布及反映图像的特点;
在这里插入图片描述在这里插入图片描述

特点:图像灰度高频与低频信号较少,主要集中在中间,比较窄,对比度较小,会使画面比较平、缺少层次。

(b)读入图像,使用imadjust()函数,采用不同参数对图像进行灰度变换,并使用imhist()函数生成两个图像的直方图,分析图像对比度变化后的效果;
在这里插入图片描述在这里插入图片描述

特点:直方图拉伸范围越大,图像的对比度也越大,图像明暗变化比较明显。

(c)读入图像,使用histeq()函数均衡化图像,分析变化后图像的效果。
在这里插入图片描述在这里插入图片描述

特点:图像对比度增加,任务变得更加分明。
2.图像空间域平滑
(1)熟悉相关函数的用法

imnoise函数----给图像加入噪声
g=imnoise(f,‘gaussian’,m,var)是将均值为m,方差为var的高斯噪声加到图像f上。m的默认值是0,var默认值是0.01。
g=imnoise(f,‘salt&pepper’,d)给图像f添加椒盐噪声,其中d是噪声密度(即包含噪声值的图像区域的百分比)。因此,大约有d*numel(f)个像素受到污染,默认的噪声密度为0.05。
g=imnoise(f,‘speckle’,var)用方程g=f+n*f将乘性噪声添加到图像f上,其中n是均值为0、方差为var的均匀分布的随机噪声。var的默认值为0.04。

filter2函数---二维滤波
Y=filter2(h,x,’shape’)
h为滤波器,x为要滤波的数据,将h放在x上移动进行模板滤波。
shape可取full,same,valid

conv2函数---二维卷积运算
Y=conv2(H,X,shape)
与filter2类似。不一样的是在计算时要将卷积核H进行旋转180°,相关核H则不需要。

imfilter函数----多维滤波
g=imfilter(f,w,options,…)
f:原始输入图像。w:滤波掩模(如我们平时常会用到的一些边沿检测算子、对象进行平滑的高斯算子等)g:对原始图像进行滤波后得到的输出图像。默认情况下尺寸与原始图像相同。后面的options对应的参数可选,不选的话有其默认值。options对应的共有3个参数,分别是处理滤波模型选项filtering_mode,“相关”或“卷积”;边界处理选项boundary_options;输出图像尺寸选项size_options。

medfilter2函数---二维中值滤波
B = medfilt2(A, [m n]) 
B = medfilt2(A)
B = medfilt2(A, ’indexed’, ...)
其中[m n]表示邻域块的大小,默认值为[3 3]。

fspecial函数----创建预定的二维滤波算子
h = fspecial(type) 
h = fspecial(type,para) 
根据函数原型对fspecial函数作个说明,fspecial是用来生成滤波器(也叫算子)的函数,使用type参数来指定滤波器的种类,使用para来对具体的滤波器种类添加额外的参数信息。h就是生成的滤波器。
type参数通常可以取gaussian、average、disk、laplacian、log、prewitt

(2)对图像进行平滑,观察图像平滑效果。
a.读入图像并加入噪声
在这里插入图片描述在这里插入图片描述
b.椒盐噪声在不同尺寸模板下的均值滤波效果
在这里插入图片描述在这里插入图片描述

c.对椒盐噪声进行均值、中值滤波
在这里插入图片描述在这里插入图片描述

d.编程对高斯噪声进行均值、中值滤波。
在这里插入图片描述在这里插入图片描述

比较均值滤波、中值滤波效果:
均值滤波是去除高斯噪声的有效手段
中值滤波是去除椒盐噪声的有效手段

3.图像空间域锐化
(1)利用Sobel算子锐化图像
在这里插入图片描述在这里插入图片描述

(2)利用fspecial函数生成各种梯度算子。
在这里插入图片描述

l1 =
     1     2     1
     0     0     0
    -1    -2    -1
l2 =
     1     1     1
     0     0     0
    -1    -1    -1
l3 =
    0.1667    0.6667    0.1667
    0.6667   -3.3333    0.6667
    0.1667    0.6667    0.1667
l4 =
    0.0113    0.0838    0.0113
    0.0838    0.6193    0.0838
    0.0113    0.0838    0.0113
l5 =
    0.0448    0.0468    0.0564    0.0468    0.0448
    0.0468    0.3167    0.7146    0.3167    0.0468
    0.0564    0.7146   -4.9048    0.7146    0.0564
    0.0468    0.3167    0.7146    0.3167    0.0468
    0.0448    0.0468    0.0564    0.0468    0.0448
l6 =
    0.1111    0.1111    0.1111
    0.1111    0.1111    0.1111
    0.1111    0.1111    0.1111
l7 =
   -0.1667   -0.6667   -0.1667
   -0.6667    4.3333   -0.6667
   -0.1667   -0.6667   -0.1667
l8 =
  170         0         0    0.0012    0.0050    0.0063    0.0050
         0    0.0000    0.0062    0.0124    0.0127    0.0127    0.0127
         0    0.0062    0.0127    0.0127    0.0127    0.0127    0.0127
    0.0012    0.0124    0.0127    0.0127    0.0127    0.0127    0.0127
    0.0050    0.0127    0.0127    0.0127    0.0127    0.0127    0.0127
    0.0063    0.0127    0.0127    0.0127    0.0127    0.0127    0.0127
    0.0050    0.0127    0.0127    0.0127    0.0127    0.0127    0.0127
    0.0012    0.0124    0.0127    0.0127    0.0127    0.0127    0.0127
         0    0.0062    0.0127    0.0127    0.0127    0.0127    0.0127
         0    0.0000    0.0062    0.0124    0.0127    0.0127    0.0127
         0         0         0    0.0012    0.0050    0.0063    0.0050
  8110.0012         0         0         0
    0.0124    0.0062    0.0000         0
    0.0127    0.0127    0.0062         0
    0.0127    0.0127    0.0124    0.0012
    0.0127    0.0127    0.0127    0.0050
    0.0127    0.0127    0.0127    0.0063
    0.0127    0.0127    0.0127    0.0050
    0.0127    0.0127    0.0124    0.0012
    0.0127    0.0127    0.0062         0
    0.0124    0.0062    0.0000         0
    0.0012         0         0         0
l9 =
  170.1111    0.1111    0.1111    0.1111    0.1111    0.1111    0.1111
  890.1111    0.1111

(3)读入一幅图像,利用不同梯度算子对图像进行锐化,比较分析不同算子的锐化结果
在这里插入图片描述在这里插入图片描述

对比分析:

laplace算子是与方向无光的各向同性边缘检测算子,若只关心边缘点的位置而不顾其周围的实际灰度差时,一般选择该算子进行检测。特点:各向同性,线性和位移是不变的,对线性和孤立点检测效果好,但边缘方向信息丢失,常产生双像素的边缘,对噪声有双倍的加强作用。
prewitt算子为在检测边缘的同时减少噪声的影响,从加大边缘检测算子的模板大小出发,由2*2扩大到3*3来计算差分算子,采用prewitt算子能检测到边缘点,还可以抑制噪声。
sobel算子在prewitt算子基础上能检测边缘点,且能进一步抑制噪声的影响,但检测的边缘较宽。梯度算子和laplacian算子都对噪声敏感,因此一般用它们检测边缘前要先对图像进行平滑。

(4)读入一幅图像,利用Laplace算子对其进行锐化处理,并利用公式g(x,y)=f(x,y)-▽^2 f(x,y)对图像的锐化增强,对比分析。
在这里插入图片描述在这里插入图片描述

Laplace算子对线性和孤立点检测效果好,
但边缘方向信息丢失,常产生双像素的边缘,对噪声有双倍的加强作用。
Laplace公式能保留原图像作为背景值,
又扩大了边缘对比度,锐化效果更好。

4.图像频率域平滑和锐化
(1)编程实现四种常用低通滤波,对比四种低通滤波效果;
a、理想低通滤波器

clc;clear;
i=imread('lena.bmp');
i1=rgb2gray(i);%将真彩色图像转换为灰度图像
i1=im2double(i1);%数据格式转换为double,数值范围变成[0,1] 
[m,n]=size(i1);%获取图像行列
i1=imnoise(i1,'salt & pepper',0.05);
%图像中心点
m0=m/2;
n0=n/2;
i2=fft2(i1);%傅里叶变换
i3=fftshift(i2);
% ----------------理想低通滤波器(Ideal Lowpass)----------------
% 定义圆的半径,也可以理解为截断频率
r=200;
% 沿图像中心取出(2n+1)*(2n+1)的矩形
i_circle=i3(m0-r:m0+r,n0-r:n0+r);
% 计算是否在半径为n的圆内,圆点为n+1,利用二象限的值,确定一、三、四象限
n2=r^2;
% 获取矩阵的宽度
w=length(i_circle);
for x=1:r+1
    x2=(x-r+1)^2;
    for y=1:r+1
        y2=(y-r+1)^2;
        if x2+y2>n2
           i_circle(x,y)=0;
           i_circle(w-x+1,y)=0;
           i_circle(w-x+1,w-y+1)=0;
           i_circle(x,w-y+1)=0;
        end
    end
end
i3=zeros(m,n);
i3(m0-r:m0+r,n0-r:n0+r)=i_circle;
i4=ifftshift(i3);
i5=ifft2(i4);
subplot(1,2,1)
imshow(i1)
xlabel('原始灰度椒盐噪声图')
subplot(1,2,2)
imshow(i5)
xlabel('理想低通滤波器')

b、Butterworth低通滤波器

clc;clear;
i=imread('lena.bmp');
i1=rgb2gray(i);%将真彩色图像转换为灰度图像
i1=im2double(i1);%数据格式转换为double,数值范围变成[0,1] 
[m,n]=size(i1);%获取图像行列
i1=imnoise(i1,'salt & pepper',0.05);
%图像中心点
m0=m/2;
n0=n/2;
i2=fft2(i1);%傅里叶变换
i3=fftshift(i2);
%--------------------------巴特沃斯低通滤波器-----------------------------
%滤波器的阶数,巴特沃斯以二阶最为有效,灰度级的负数几乎为零,振铃现象很微小
N=2;
%截至频率距离圆点的距离
D0=20;
for x=1:m
    for y=1:n
        %计算点(x,y)到中心点的距离
        d=sqrt((x-m0)^2+(y-n0)^2);
        %计算巴特沃斯滤波器
        h=1/(1+(d/D0)^(2*N));
        %用滤波器乘以主函数
        i3(x,y)=i3(x,y)*h;
    end
end
i4=ifftshift(i3);
i5=ifft2(i4);
subplot(1,2,1)
imshow(i1)
xlabel('原始灰度椒盐噪声图')
subplot(1,2,2)
imshow(i5)
xlabel('巴特沃斯低通滤波器')

c、指数低通滤波器

clc;clear;
i=imread('lena.bmp');
i1=rgb2gray(i);%将真彩色图像转换为灰度图像
i1=im2double(i1);%数据格式转换为double,数值范围变成[0,1] 
[m,n]=size(i1);%获取图像行列
i1=imnoise(i1,'salt & pepper',0.05);
%图像中心点
m0=m/2;
n0=n/2;
i2=fft2(i1);%傅里叶变换
i3=fftshift(i2);
%--------------------指数低通滤波器-----------------------------
%滤波器的阶数,指数以二阶最为有效,灰度级的负数几乎为零,振铃现象很微小
N=2;
%截至频率距离圆点的距离
D0=20;
for x=1:m
     for y=1:n
        %计算点(x,y)到中心点的距离
         d=sqrt((x-m0)^2+(y-n0)^2);
         %计算指数低通滤波器
         h=exp(-((d/D0))^N);
         %用滤波器乘以主函数
         i3(x,y)=i3(x,y)*h;         
     end
end
i4=ifftshift(i3);
i5=ifft2(i4);
subplot(1,2,1)
imshow(i1)
xlabel('原始灰度椒盐噪声图')
subplot(1,2,2)
imshow(i5)
xlabel('指数低通滤波器')

d、梯形低通滤波器

clc;clear;
i=imread('lena.bmp');
i1=rgb2gray(i);%将真彩色图像转换为灰度图像
i1=im2double(i1);%数据格式转换为double,数值范围变成[0,1] 
[m,n]=size(i1);%获取图像行列
i1=imnoise(i1,'salt & pepper',0.05);
%图像中心点
m0=m/2;
n0=n/2;
i2=fft2(i1);%傅里叶变换
i3=fftshift(i2);
%---------------------梯形低通滤波器-------------------
%截至频率距离圆点的距离
D0=20;D1=80;
for x=1:m
     for y=1:n
        %计算点(x,y)到中心点的距离
         d=sqrt((x-m0)^2+(y-n0)^2);
         %计算指数低通滤波器
         if d<D0
              h=1;
         else if d>D0 && d<D1
                 h=(d-D1)/(D0-D1);
             else
                 h=0;
             end
         end                      
         %用滤波器乘以主函数
         i3(x,y)=i3(x,y)*h;         
     end
end
i4=ifftshift(i3);
i5=ifft2(i4);
subplot(1,2,1)
imshow(i1)
xlabel('原始灰度椒盐噪声图')
subplot(1,2,2)
imshow(i5)
xlabel('指数低通滤波器')

四种低通滤波器滤波效果:

低通滤波器进行平滑处理可以去噪,同时对有用高频成分也滤除。
这种去噪的处理以牺牲清晰度为代价。 
类别	振铃程度	图像模糊程度	噪声平滑程度
ILPF	严重	严重	最好
TLPF	较轻	轻	好
ELPF	无	较轻	一般
BLPF	无	很轻	一般

(2)编程实现四种常用高通滤波,对比四种高通滤波效果;
a、理想高通滤波器

clc;clear;
i=imread('lena.bmp');
i1=rgb2gray(i);%将真彩色图像转换为灰度图像
i1=im2double(i1);%数据格式转换为double,数值范围变成[0,1] 
[m,n]=size(i1);%获取图像行列
%图像中心点
m0=m/2;
n0=n/2;
i2=fft2(i1);%傅里叶变换
i3=fftshift(i2);
%----------------理想高通滤波器(Ideal hightpass)----------------
%定义圆的半径,也可以理解为截断频率
r=30;
% 沿图像中心取出(2n+1)*(2n+1)的矩形
i_circle=i3(m0-r:m0+r,n0-r:n0+r);
%计算是否在半径为n的圆内,圆点为n+1,利用二象限的值,确定一、三、四象限
n2=r^2;
%获取矩阵的宽度
w=length(i_circle);
for x=1:r+1
    x2=(x-r+1)^2;
    for y=1:r+1
        y2=(y-r+1)^2;
        if x2+y<n2
           i_circle(x,y)=0;
           i_circle(w-x+1,y)=0;
           i_circle(w-x+1,w-y+1)=0;
           i_circle(x,w-y+1)=0;
        end
    end
end
i3(m0-r:m0+r,n0-r:n0+r)=i_circle;
i4=ifftshift(i3);
i5=ifft2(i4);
subplot(1,2,1)
imshow(i1)
xlabel('原始灰度图')
subplot(1,2,2)
imshow(i5)
xlabel('理想高通滤波器')

b、巴特沃斯高通滤波器

clc;clear;
i=imread('lena.bmp');
i1=rgb2gray(i);%将真彩色图像转换为灰度图像
i1=im2double(i1);%数据格式转换为double,数值范围变成[0,1] 
[m,n]=size(i1);%获取图像行列
%图像中心点
m0=m/2;
n0=n/2;
i2=fft2(i1);%傅里叶变换
i3=fftshift(i2);
%--------------------------巴特沃斯高通滤波器-----------------------------
%滤波器的阶数,巴特沃斯以二阶最为有效,灰度级的负数几乎为零,振铃现象很微小
N=2;
%截至频率距离圆点的距离
D0=20;
for x=1:m
    for y=1:n
        %计算点(x,y)到中心点的距离
        d=sqrt((x-m0)^2+(y-n0)^2);
        %计算巴特沃斯滤波器
        h=1/(1+(D0/d)^(2*N));
        %用滤波器乘以主函数
        i3(x,y)=i3(x,y)*h;
    end
end
i4=ifftshift(i3);
i5=ifft2(i4);
subplot(1,2,1)
imshow(i1)
xlabel('原始灰度图')
subplot(1,2,2)
imshow(i5)
xlabel('巴特沃斯高通滤波器')

c、指数高通滤波器

clc;clear;
i=imread('lena.bmp');
i1=rgb2gray(i);%将真彩色图像转换为灰度图像
i1=im2double(i1);%数据格式转换为double,数值范围变成[0,1] 
[m,n]=size(i1);%获取图像行列
%图像中心点
m0=m/2;
n0=n/2;
i2=fft2(i1);%傅里叶变换
i3=fftshift(i2);
%--------------------指数高通滤波器-----------------------------
%滤波器的阶数,指数以二阶最为有效,灰度级的负数几乎为零,振铃现象很微小
N=2;
%截至频率距离圆点的距离
D0=20;
for x=1:m
     for y=1:n
        %计算点(x,y)到中心点的距离
         d=sqrt((x-m0)^2+(y-n0)^2);
         %计算指数低通滤波器
         h=exp(-((D0/d))^N);
         %用滤波器乘以主函数
         i3(x,y)=i3(x,y)*h;         
     end
end
i4=ifftshift(i3);
i5=ifft2(i4);
subplot(1,2,1)
imshow(i1)
xlabel('原始灰度图')
subplot(1,2,2)
imshow(i5)
xlabel('指数高通滤波器')

d、梯形高通滤波器

clc;clear;
i=imread('lena.bmp');
i1=rgb2gray(i);%将真彩色图像转换为灰度图像
i1=im2double(i1);%数据格式转换为double,数值范围变成[0,1] 
[m,n]=size(i1);%获取图像行列
%图像中心点
m0=m/2;
n0=n/2;
i2=fft2(i1);%傅里叶变换
i3=fftshift(i2);
%---------------------梯形高通滤波器-------------------
%截至频率距离圆点的距离
D0=20;D1=80;
for x=1:m
     for y=1:n
        %计算点(x,y)到中心点的距离
         d=sqrt((x-m0)^2+(y-n0)^2);
         %计算指数低通滤波器
         if d<D0
              h=0;
         else if d>D0 && d<D1
                 h=(d-D1)/(D0-D1);
             else
                 h=1;
             end
         end                      
         %用滤波器乘以主函数
         i3(x,y)=i3(x,y)*h;         
     end
end
i4=ifftshift(i3);
i5=ifft2(i4);
subplot(1,2,1)
imshow(i1)
xlabel('原始灰度图')
subplot(1,2,2)
imshow(i5)
xlabel('梯形高通滤波器')

对比四种高通滤波结果:

理想高通滤波器处理后的图像边缘有抖动现象;Butterworth高通滤波器锐化效果好,边缘抖动现象不明显,但计算复杂;
指数高通滤波器处理后的图像效果差于Butterworth,边缘抖动现象不明显;
梯形高通滤波器会产生轻微抖动,但因计算简单经常被使用。

五、实验心得体会

1.理解了空间域和频率域中图像的增强操作。
2.掌握了图像平滑和锐化的方法,如何给图像添加噪声和去噪的操作。
3.会使用matlab自带的函数和自己编写的函数分别对图像进行增强。

猜你喜欢

转载自blog.csdn.net/chengzilhc/article/details/124556294