Advertisement

【数字图像处理】实验二 图像增强(MATLAB实现)

阅读量:

实验总结
本次实验旨在掌握Matlab在图像处理中的应用,重点学习和掌握图像处理的基本函数和方法。实验内容包括对彩色图像进行灰度化、直方图均衡化、伪彩色增强、添加噪声与中值滤波、Sobel算子滤波等操作。通过实验,掌握了以下内容:
Matlab函数库:熟悉了imhist、histeq、imadjust、imfilter、medfilt2、filter2、fspecial等函数及其在图像处理中的作用。
图像处理方法:学习了直方图均衡化、伪彩色增强、中值滤波、Sobel算子滤波等技术。
实验流程:从读取图像到处理变换,再到结果展示,掌握了Matlab图像处理的基本流程。
拓展内容:通过热金属编码和彩虹编码实现伪彩色增强,利用均值滤波、高斯滤波、中值滤波、Sobel算子和Laplacian滤波实现平滑和锐化效果。
实验结果表明,Matlab在图像处理中功能强大,适合处理复杂的图像增强任务。通过实践,进一步理解了图像处理算法的原理和应用,为后续学习和应用打下了基础。

目录

一、实验意义及目的

二、实验内容

三、Matlab 相关函数介绍

四、算法原理

五、参考代码及扩展代码流程图

(1)参考代码流程图

(2)扩展代码流程图

六、参考代码

七、实验要求

(1)对以上处理变换参数,查看处理效果;

(2)更改伪彩色增强方法为热金属编码或彩虹编码伪彩色处理

(3)设计不同的平滑滤波、锐化滤波方法,查看处理效果

(4)自行设计方法,实现对彩色图像增强处理。(Python、opencv实现)


一、实验意义及目的

( 1 )进一步掌握图像处理工具 Matlab ,熟悉基于 Matlab 的图像处理函数。

(2)掌握各种图像增强方法。

二、实验内容

打开一幅彩色图像 Image1 ,使用 Matlab 图像处理函数,对其进行下列变换:

( 1 )将 Image1 灰度化为 gray ,统计并显示其灰度直方图;

(2)对 gray 进行分段线性变换;

(3)对 gray 进行直方图均衡化;

(4)对 gray 进行伪彩色增强;

(5)对 gray 添加噪声并平滑;

(6)对 gray 利用 Sobel 算子锐化;

(7)实验要求中的拓展内容。

三、Matlab相关函数介绍

**( 1)imhist 函数 **

功能:统计变显示图像的直方图。

调用格式:

imhist(I) :显示图像 I 的直方图。

imhist(I, n) :显示图像 I 的直方图, n 指定直方图中的列数。

[COUNTS,X] = imhist(...) :返回直方图数据向量 COUNTS 和相应的色彩值向量 X 。

**(2) histeq 函数 **

功能:直方图均衡化

调用格式:

通过函数 histeq 对图像 I 进行直方图均衡化处理,使其直方图调整为指定的向量 hgram 中的各元素值。

域为 [0,1] ;

J = histeq(I,N) :执行直方图均衡化以获得图像 J,其中 I 为输入图像,N 为输出图像的灰度级数,默认值为

对输入图像 I 进行直方图均衡化以生成输出图像 J,其中 N 为输出图像的灰度级数,默认值为

使用 histeq 函数对输入图像 I 进行处理,生成输出图像 J,其中 N 为输出图像的灰度级数,默认值为

J = histeq(I,N) :对输入图像 I 进行直方图均衡化处理,输出图像 J 的灰度级数由参数 N 决定,默认值为

J = histeq(I,N) :调用 histeq 函数对输入图像 I 进行直方图均衡化处理,输出图像 J 的灰度级数由参数 N 决定,默认值为

64 。

**(3) imadjust 函数 **

功能:调整图像灰度值或颜色映射表,增加图像的对比度。

调用格式:J = imadjust(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA)用于调整图像 I 的灰度值。其中,[LOW_IN; HIGH_IN]指定原始图像中需要变换的灰度范围,[LOW_OUT; HIGH_OUT]指定变换后的灰度范围。超出 LOW_IN 和 HIGH_IN 范围的像素值将被截断。若输入参数为空矩阵,则默认使用 [0,1]。GAMMA参数为标量,用于定义灰度映射曲线的形状。当 GAMMA 值小于 1 时,映射会偏向于增强亮度;当 GAMMA 大于 1 时,映射会偏向于增强对比度。此外,函数 NEWMAP = imadjust(MAP,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA)也可用于调整索引图像的颜色表,其参数与上述函数相同。

RGB2 = imadjust(RGB1,...) :对 RGB 图像 RGB1 的 R 、 G 、 B 分量进行调整。

**(4) imnoise 函数 **

函数调用式 J = imnoise(I,type,parameters) ,其中该函数用于在图像 I 中添加指定类型的噪声;其中 type 用于指定噪声类型。

parameters 为其所对应参数,可取值如表 1 所示:

**(5 )fspecial 函数 **

调用函数 fspecial(type, parameters) 来生成指定类型和参数的二维滤波器 h,如表 2 所示,

**(6) filter2 函数 **

Y为由参数B、X及shape所定义的滤波器函数输出,其中,B为二维FIR滤波器,用于对矩阵X进行滤波处理;shape参数则决定了输出结果Y。

该函数采用参数类型,其中'full'表示Y的维数大于X,'same'表示Y的维数等于X,'valid'表示Y的维数小于X,且默认设置为'same'。

**(7) imfilter 函数 **

B=imfilter(A,H,option1,option2,…): 基于指定的属性参数 option1、option2 等,执行多维滤波操作。

器 H 对图像 A 进行滤波, H 常由函数 fspecial 输出得到。属性参数如表 3 所示:

**(8) medfilt2 函数 **

B = medfilt2(A,[m n]]) :用 [m n] 大小的滤波器对图像 A 进行中值滤波,输出图像为 B ,滤

波器大小默认为 3×3 。

**(9) edge 函数 **

BW 由 edge 函数计算得到,其中 BW 是一个二值图像,其中边界处为 1,非边界处为 0。

函数的取值为真时为 1,否则为 0。默认情况下,edge 函数采用 Sobel 算子进行边缘检测,也可以指定不同的算子。

BW = edge(I,'sobel') ; BW = edge(I,'prewitt') ; BW = edge(I,'roberts') ;

BW = edge(I,'log') ; BW = edge(I,'canny') 引号内为指定算子。

BW使用edge函数进行边缘检测,参数设置为'sobel'和thresh。BW使用edge函数进行边缘检测,参数设置为'sobel'和thresh。BW使用edge函数进行边缘检测,参数设置为'sobel'和thresh。

四、算法原理

图像增强技术是一种基础性的图像处理方法,旨在提升图像质量并突出感兴趣区域,同时优化视觉效果或便于计算机分析。其主要包含点运算、模板运算等方法,其中根据模板运算功能可进一步细分为图像平滑和图像锐化等类型。

灰度级变换通过变换函数将输入像素的灰度值映射到新的输出值。直方图修正法通过构建灰度级变换函数对原图像的直方图进行调整,以达到特定效果。基于照度-反射模型的图像增强方法通常将自然景象图像分解为照明函数与反射函数的乘积形式。其算法原理通常采用对数变换,将乘积形式转换为相加形式,并设计函数分别作用于高频和低频成分,以实现图像增强效果。伪彩色增强是一种将灰度图像转换为彩色图像的技术,其目标是通过线性或非线性映射将不同灰度级转换为不同颜色,从而提高图像内容的可辨识度,达到增强效果。

图像平滑,通常被用来去除或减少图像中的噪声,从而提升图像质量的过程称为图像平滑。图像平滑方法大致可分为两类:空域法和频域法。空域法主要通过模板运算,在像素点领域内,利用噪声像素点的特性进行滤波;频域法是指对图像进行正交变换,利用噪声对应高频信息的特性进行滤波。

图像锐化技术,其主要目的是增强景物的边缘和轮廓,突出图像中的细节或恢复被模糊所隐藏的细节。图像的边缘主要包括三种类型:细线型、突变型和渐变型。通过分析边缘变化曲线及其一阶、二阶微分曲线,即可确定边缘的位置。

五、参考代码及扩展代码流程图

(1)参考代码流程图

(2)扩展代码流程图

六、参考代码

该代码实现了对彩色图像的灰度化处理,并对灰度图像进行直方图统计分析,同时包含分段线性变换的应用,以及直方图的构建。

均衡化、伪彩色增强、添加噪声与中值滤波、 Sobel 算子滤波。

复制代码
 Image1=im2double(imread('lotus.bmp'));

    
 gray=rgb2gray(Image1);
    
 imhist(gray); 
    
 [h,w]=size(gray); 
    
 NewImage1=zeros(h,w); 
    
 a=80/256; b=180/256; c=30/256; d=220/256;
    
 for x=1:w
    
  for y=1:h
    
  if gray(y,x)<a 
    
  NewImage1(y,x)=gray(y,x)*c/a;
    
  elseif gray(y,x)<b
    
  NewImage1(y,x)=(gray(y,x)-a)*(d-c)/(b-a)+c;
    
  else
    
  NewImage1(y,x)=(gray(y,x)-b)*(255-d)/(255-b)+d;
    
  end 
    
  end
    
 end
    
 figure,imshow(NewImage1),title('分段线性变换');
    
 NewImage2=histeq(gray);
    
 figure,imshow(NewImage2),title('直方图均衡化');
    
 NewImage3=zeros(h,w,3);
    
 for x=1:w
    
  for y=1:h
    
  if gray(y,x)<64/256
    
  NewImage3(y,x,1)=0;
    
  NewImage3(y,x,2)=4*gray(y,x);
    
  NewImage3(y,x,3)=1;
    
  elseif gray(y,x)<128/256
    
  NewImage3(y,x,1)=0;
    
  NewImage3(y,x,2)=1;
    
  NewImage3(y,x,3)=2-4*gray(y,x);
    
  elseif gray(y,x)<192/256
    
  NewImage3(y,x,1)=4*gray(y,x)-2;
    
  NewImage3(y,x,2)=1;
    
  NewImage3(y,x,3)=0;
    
  else
    
  NewImage3(y,x,1)=1;
    
  NewImage3(y,x,2)=4-4*gray(y,x);
    
  NewImage3(y,x,3)=0;
    
  end
    
  end
    
 end
    
 figure,imshow(NewImage3);
    
  
    
 noiseIsp=imnoise(gray,'salt & pepper',0.1); 
    
 noiseIg=imnoise(gray,'gaussian'); 
    
 result1=medfilt2(noiseIsp); 
    
 result2=medfilt2(noiseIg);
    
 figure;
    
 subplot(121),imshow(result1),title('椒盐噪声3×3中值滤波');
    
 subplot(122),imshow(result2),title('高斯噪声3×3中值滤波');
    
 H1=[-1 -2 -1;0 0 0;1 2 1]; 
    
 H2=[-1 0 1;-2 0 2;-1 0 1]; 
    
 R1=imfilter(gray,H1); 
    
 R2=imfilter(gray,H2);
    
 edgeImage=abs(R1)+abs(R2); 
    
 sharpImage=gray+edgeImage; 
    
 figure;
    
 subplot(121),imshow(edgeImage),title('Sobel梯度图像'); 
    
 subplot(122),imshow(sharpImage),title('Sobel锐化图像');

程序的运行效果如下:

七、实验要求

1. 熟悉 Matlab 函数,读懂参考代码;

2. 拓展内容:

**( 1)对以上处理变换参数,查看处理效果; **

(2)更改伪彩色增强方法为热金属编码或彩虹编码

伪彩色处理

伪彩色增强是一种通过将黑白图像的不同亮度层次映射为彩色图像的技术手段。

多种方法可以实现伪彩色增强,而该增强方法主要采用空间域灰度级-彩色变换法。

空间域灰度级-彩色变换技术:能够将灰度图像序列转换为具有丰富色彩渐变效果的彩色图像,变换后的图像具有良好的视觉效果。主要色相通过将灰度图像数据f(x,y)输入具有不同变换特性的红、绿、蓝3个变换器,分别生成fR(x,y)、fG(x,y)、fB(x,y)三个独立的色彩分量信号,再按比例合成一副完整的彩色图像。

彩虹编码和热金属编码是其中的两种变化函数。

热金属编码

复制代码
 Image1=imread('lotus.bmp');

    
     
    
 %转换为灰度
    
 gray=rgb2gray(Image1);
    
 [h,w]=size(gray);
    
 %新图像的矩阵
    
 NewImage4=zeros(h,w,3);
    
 for x=1:h
    
     for y=1:w
    
     if gray(x,y)<64
    
     NewImage4(x,y,1)=0;
    
     elseif gray(x,y)<128
    
     NewImage4(x,y,1)=255*(gray(x,y)-64)/64;
    
     else
    
     NewImage4(x,y,1)=255;
    
     end
    
     end
    
 end
    
 for x=1:h
    
     for y=1:w
    
     if gray(x,y)<128
    
     NewImage4(x,y,2)=0;
    
     elseif gray(x,y)<192
    
     NewImage4(x,y,2)=255*(gray(x,y)-128)/64;
    
     else
    
     NewImage4(x,y,2)=255;
    
     end
    
     end
    
 end
    
 for x=1:h
    
     for y=1:w
    
     if gray(x,y)<64
    
     NewImage4(x,y,3)=255*gray(x,y)/64;
    
     elseif gray(x,y)<96
    
     NewImage4(x,y,3)=255;
    
     elseif gray(x,y)<128
    
     NewImage4(x,y,3)=255*(128-gray(x,y))/32;
    
     elseif gray(x,y)<192 
    
     NewImage4(x,y,3)=0;
    
     else
    
     NewImage4(x,y,3)=255*(gray(x,y)-192)/64;
    
     end
    
     end
    
 end
    
 imshow(NewImage4),title('热金属编码')

彩虹编码

复制代码
 Image1=imread('lotus.bmp');

    
     
    
 %转换为灰度
    
 gray=rgb2gray(Image1);
    
 [h,w]=size(gray);
    
 %新图像的矩阵
    
 NewImage3=zeros(h,w,3);
    
 for x=1:h
    
     for y=1:w
    
     if gray(x,y)<96
    
     NewImage3(x,y,1)=0;
    
     elseif gray(x,y)<128
    
     NewImage3(x,y,1)=255*(gray(x,y)-96)/32;
    
     else
    
     NewImage3(x,y,1)=255;
    
     end
    
     end
    
 end
    
 for x=1:h
    
     for y=1:w
    
     if gray(x,y)<32
    
     NewImage3(x,y,2)=0;
    
     elseif gray(x,y)<64
    
     NewImage3(x,y,2)=255*(gray(x,y)-32)/32;
    
     elseif gray(x,y)<128
    
     NewImage3(x,y,2)=255;
    
     elseif gray(x,y)<192
    
     NewImage3(x,y,2)=255*(192-gray(x,y))/64;
    
     else
    
     NewImage3(x,y,2)=255*(gray(x,y)-192)/64;
    
     end
    
     end
    
 end
    
 for x=1:h
    
     for y=1:w
    
     if gray(x,y)<32
    
     NewImage3(x,y,3)=255*gray(x,y)/32;
    
     elseif gray(x,y)<64
    
     NewImage3(x,y,3)=255;
    
     elseif gray(x,y)<96
    
     NewImage3(x,y,3)=255*(96-gray(x,y))/32;
    
     elseif gray(x,y)<192 
    
     NewImage3(x,y,3)=0;
    
     else
    
     NewImage3(x,y,3)=255*(gray(x,y)-192)/64;
    
     end
    
     end
    
 end
    
 imshow(NewImage3),title('彩虹编码')

(3)设计不同的平滑滤波、锐化滤波方法,查看处理效果

1.平滑滤波:

复制代码
 Image1=im2double(imread('lotus.bmp'));

    
 gray=rgb2gray(Image1); 
    
 noisegaus=imnoise(gray,'gaussian'); %高斯噪声 
    
 figure; 
    
 subplot(121),imshow(gray),title('原图'); 
    
 subplot(122),imshow(noisegaus),title('高斯噪声图'); 
    
 result1=filter2(fspecial('average',3),noisegaus); 
    
 figure; 
    
 imshow(result1),title('3*3 均值滤波');
    
 gausFilter=fspecial('gaussian',[2*3+1 2*3+1],0.6); 
    
 result2 = imfilter(noisegaus,gausFilter,'conv'); 
    
 figure; 
    
 imshow(result2),title('sigmal=0.6 高斯滤波') 
    
 result3 = medfilt2(noisegaus); 
    
 figure; 
    
 imshow(result3),title('3*3 中值滤波'); 
    
  
    
 image2 = imread('lotus.bmp'); 
    
 image2 = imnoise(image2,'gaussian'); 
    
 Fimage = fftshift(fft2(double(image2))); 
    
 [N M] = size(Fimage); 
    
 g = zeros(N,M); 
    
 r1 = floor(M/2); r2=floor(N/2); 
    
 d0 = [5 11 45 68]; 
    
 for i = 1:4 
    
     for x = 1:M 
    
     for y = 1:N 
    
         d = sqrt((x-r1)^2+(y-r2)^2); 
    
         if d<=d0(i) 
    
             h=1; 
    
         else
    
             h=0;
    
         end
    
         g(y,x) = h*Fimage(y,x); 
    
     end
    
     end
    
     g = real(ifft2(ifftshift(g))); 
    
     figure,imshow(uint8(g)),title(['理想低通滤波 D0=',num2str(d0(i))]); 
    
 end

运行结果:

2.锐化滤波

复制代码
 Image1=im2double(imread('lotus.bmp'));

    
 gray=rgb2gray(Image1);
    
 H1=[-1 -2 -1;0 0 0;1 2 1];
    
 H2=[-1 0 1;-2 0 2;-1 0 1];
    
 R1=imfilter(gray,H1);
    
 R2=imfilter(gray,H2);
    
 edgeImage=abs(R1)+abs(R2); 
    
 sharpImage=gray+edgeImage; 
    
 figure; 
    
 subplot(121),imshow(edgeImage),title('Sobel 梯度图像'); 
    
 subplot(122),imshow(sharpImage),title('Sobel 锐化图像 ');
    
 H1=[1 0;0 -1]; H2=[0 1;-1 0]; R1=imfilter(gray,H1); 
    
 R2=imfilter(gray,H2); edgeImage=abs(R1)+abs(R2);
    
 sharpImage=gray+edgeImage; 
    
 figure; subplot(121),imshow(edgeImage),title('Roberts 梯度图像 '); 
    
 subplot(122),imshow(sharpImage),title('Roberts 锐化图像 ');
    
 H1=[-1 -1 -1;0 0 0;1 1 1];
    
 H2=[-1 0 1;-1 0 1;-1 0 1]; 
    
 R1=imfilter(gray,H1); 
    
 R2=imfilter(gray,H2); 
    
 edgeImage=abs(R1)+abs(R2); 
    
 sharpImage=gray+edgeImage; 
    
 figure; 
    
 subplot(121),imshow(edgeImage),title('Prewitt 梯度图像 '); 
    
 subplot(122),imshow(sharpImage),title('Prewitt 锐化图像 ');
    
 H = fspecial('laplacian',0);
    
 R = imfilter(gray,H); 
    
 edgeImage = abs(R); 
    
 H1 = [0 -1 0;-1 5 -1;0 -1 0]; 
    
 sharpImage = imfilter(gray,H1);
    
 figure;
    
 subplot(121),imshow(edgeImage),title('Laplacian 滤波图 像'); 
    
 subplot(122),imshow(sharpImage),title('Laplacian锐化图 像');
    
 BW = edge(gray,'log'); 
    
 H = fspecial('log',7,1); 
    
 R = imfilter(gray,H); 
    
 edgeImage = abs(R); 
    
 sharpImage = gray+edgeImage; 
    
 figure;
    
 subplot(131),imshow(BW),title('LOG 边缘检测图像'); 
    
 subplot(132),imshow(edgeImage),title('LOG 梯度图像'); 
    
 subplot(133),imshow(sharpImage),title('LOG 锐化图像');
    
 BW = edge(gray,'canny');
    
 figure; 
    
 imshow(BW),title('Canny 边缘检测');

运行结果:

Sobel 算子效果图

Roberts 算子效果图

Prewitt 算子效果图

Laplacian 算子效果图

LOG 算子效果图

Canny 算子效果图

(4)自行设计方法,实现对彩色图像增强处理。(Python、opencv实现)

复制代码
 import matplotlib.pyplot as plt

    
 import cv2 as cv
    
 import numpy as np
    
  
    
 # 显示汉字用
    
 plt.rcParams['font.sans-serif'] = ['SimHei']
    
 plt.rcParams['axes.unicode_minus'] = False
    
  
    
  
    
 # 定义坐标数字字体和大小
    
 def label_def():
    
     plt.rcParams['font.sans-serif'] = ['SimHei']
    
     plt.rcParams['axes.unicode_minus'] = False
    
  
    
  
    
 if __name__ == '__main__':
    
     # 读取图片
    
     img_orig = cv.imread('lotus.bmp', 1)  # 读取彩色图片
    
     # 伽马变换处理
    
     img_gama = np.power(img_orig.astype(np.float32), 1.5)  # 图像较亮,若采用幂率变换,y>1,压缩高灰度级
    
     temp1 = img_gama - np.min(img_gama)
    
     img_gama = temp1 / np.max(temp1)
    
     # 显示所用的变换函数
    
     x1 = np.linspace(img_orig.min(), img_orig.max(), num=200)
    
     y1 = np.power(x1, 1.5)  # 伽马函数
    
  
    
     plt.subplot(221), plt.title('原图像'), plt.imshow(cv.cvtColor(img_orig, cv.COLOR_BGR2RGB)), plt.axis('off')
    
     plt.subplot(223), plt.title('伽马变换'), plt.imshow(cv.cvtColor(img_gama, cv.COLOR_BGR2RGB)), plt.axis('off')
    
     plt.subplot(224), plt.title('s=r**(1.5)'), plt.plot(x1, y1), plt.grid, label_def()
    
     plt.show()

运行结果:

全部评论 (0)

还没有任何评论哟~