实验2:图像增强

一 实验目的和要求

理解图像灰度映射的原理。
掌握MATLAB编程实现图像灰度映射的方法
理解直方图均衡的原理
掌握MATLAB中用直方图均衡改善图像的方法
理解空间滤波的种类和方法
掌握使用MATLAB中的空间滤波增强图像的方法
了解傅里叶变换及频域滤波原理
掌握使用MATLAB中的频域滤波增强图像的方法

二 实验环境

操作系统环境:windows 10
开发工具:MATLAB R2018b
其它辅助工具:百度、谷歌搜索引擎

三 实验内容

1. 考虑使用图1所示的门形灰度映射函数,其作用是可将某个灰度值范围(这里为s1到s2间)变得比较突出(较高的灰度值t2),而将其余灰度值变为某个低灰度值(t1)。

在这里插入图片描述

图1门形灰度映射函数
(1)用门形灰度映射函数对给定输入图像进行增强。如果同时增加s1和s2的值,或同时减小s1和s2的值,指出两种情况下输出图像都会发生什么样的变化。
(2)用门形灰度映射函数对给定输入图像进行增强。如果增加s1而减小s2的值,或减小s1而增加s2的值,指出两种情况下输出图像都会发生什么样的变化。
(1)分析及设计思路
设置初始s1和s2的值,通过循环判断的到增强的灰色图像,如图2所示。然后根据题目而修改s1或者s2的大小,最后得到结果。
在这里插入图片描述

图2 增强后的灰度图像
(2)解答及源码
第一问(1)同时增加s1、s2 图像比前面增强的图像变白,同时减小s1、s2 图像比前面增强的图像变黑。
第二问(2)增加s1减小s2 图像整体变黑【比(1)的黑更黑】,减小s1增加s2 图像整体变白【比(1)的白更白】。
本程序的源码如下所示:

	clc;  
	clear;  
	close all;  
	%% (1)  
	% 读取图像  % 因为我的matla
	im = imread('lena.jpg');  
	% 灰度化处理  
	im1 = rgb2gray(im);  
	  
	% 显示原图  
	figure;  
	subplot(221);  
	imshow(im1);  
	title('原始灰度图像');  
	  
	% 设定参数  
	t1 = 20;  
	t2 = 128;  
	  
	% 图像尺寸  
	[N,M] = size(im1);  
	  
	% 灰度阈值  
	s1 = 70;  
	s2 = 150;  
	  
	% 增强图像  
	im2 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im2(i,j) = t1;  
	        else  
	            im2(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(222);  
	imshow(im2);  
	title('增强的灰度图像');  
	  
	%% s1 s2 同时增大  
	% 灰度阈值  
	s1 = 70+50;  
	s2 = 150+50;  
	%   
	im3 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im3(i,j) = t1;  
	        else  
	            im3(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(223);  
	imshow(im3);  
	title('s1s2同时增加后增强的灰度图像');  
	  
	%% s1 s2 同时增大  
	% 灰度阈值  
	s1 = 70-50;  
	s2 = 150-50;  
	% 增强图像  
	im4 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im4(i,j) = t1;  
	        else  
	            im4(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(224);  
	imshow(im4);  
	title('s1s2同时减小后增强的灰度图像');  
	%% 同时增加s1s2 图像比前面增强的图像变白  
	%% 同时减小s1s2 图像比前面增强的图像变黑  
	  
	%% (2)  
	% 显示原图  
	figure;  
	subplot(221);  
	imshow(im1);  
	title('原始灰度图像');  
	subplot(222);  
	imshow(im2);  
	title('增强的灰度图像');  
	%% 增加s1 减小s2  
	% 灰度阈值  
	s1 = 70+30;  
	s2 = 150-30;  
	%   
	im5 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im5(i,j) = t1;  
	        else  
	            im5(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(223);  
	imshow(im5);  
	title('s1增加s2减小后增强的灰度图像');  
	%% 减小s1 增加s2  
	% 灰度阈值  
	s1 = 70-30;  
	s2 = 150+30;  
	%   
	im6 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im6(i,j) = t1;  
	        else  
	            im6(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(224);  
	imshow(im6);  
	title('s1减小s2增加后增强的灰度图像');  
	  
	%% 增加s1减小s2 图像整体变黑【比(1)的黑更黑】  
	%% 减小s1增加s2 图像整体变白【比(1)的白更白】  

(3)实验结果及分析
实验结果如图3、4所示:
在这里插入图片描述

图3 第1问实验结果
在这里插入图片描述

图4第2问实验结果

2. 设有一幅图像有如图5所示直方图,请用手工方法列表计算该直方图的均衡化直方图。

2题

图5 直方图
(1)分析及设计思路
根据课本例2.4.2学习其计算方法,然后逐步计算本题,最终的出结果。
(2)解答及源码
计算步骤如下表1所示。
表1 均衡化直方图步骤
序号 运算 步骤和结果
1 原始图像灰度级 0 1 2 3 4 5 6 7
2 原始直方图sk 0.17 0.09 0.09 0.08 0.07 0.06 0.06 0.38
3 计算累计直方图各项tk 0.17 0.26 0.35 0.43 0.5 0.55 0.62 1
4 取整扩展:
tk=int[(L-1)tk+0.5]
L:灰度级个数 1 2 2 3 3 4 4 7
5 确定映射对应关系
(sk→tk) 0→1 1 , 2→2 3 , 4→3 5 , 6→4 7→7
6 根据映射关系计算
均衡化直方图   0.174 0.174 0.148 0.12     0.384

(3)实验结果及分析
本次实验题目2的结果如图6所示。
在这里插入图片描述

图6 第2题实验结果

  1. 收集10幅灰度图像,包括过亮、过暗、对比度暗淡等图像,使用MATLAB的直方图均衡方法对其进行直方图均衡。依次显示原图、原图直方图、均衡后的图像及其直方图,尝试总结一下直方图均衡方法对什么样的图像改善效果较好。
    (1)分析及设计思路
    使用matlab显示图像灰色直方图函数imhist和直方图均衡函数histeq对图像进行处理,从而得到实验结果。
    (2)解答及源码
    此程序的源码如下:
	clc;  
	clear;  
	close all;  
	%% (1)  
	% 读取图像  % 因为我的matla
	im = imread('lena.jpg');  
	% 灰度化处理  
	im1 = rgb2gray(im);  
	  
	% 显示原图  
	figure;  
	subplot(221);  
	imshow(im1);  
	title('原始灰度图像');  
	  
	% 设定参数  
	t1 = 20;  
	t2 = 128;  
	  
	% 图像尺寸  
	[N,M] = size(im1);  
	  
	% 灰度阈值  
	s1 = 70;  
	s2 = 150;  
	  
	% 增强图像  
	im2 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im2(i,j) = t1;  
	        else  
	            im2(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(222);  
	imshow(im2);  
	title('增强的灰度图像');  
	  
	%% s1 s2 同时增大  
	% 灰度阈值  
	s1 = 70+50;  
	s2 = 150+50;  
	%   
	im3 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im3(i,j) = t1;  
	        else  
	            im3(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(223);  
	imshow(im3);  
	title('s1s2同时增加后增强的灰度图像');  
	  
	%% s1 s2 同时增大  
	% 灰度阈值  
	s1 = 70-50;  
	s2 = 150-50;  
	% 增强图像  
	im4 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im4(i,j) = t1;  
	        else  
	            im4(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(224);  
	imshow(im4);  
	title('s1s2同时减小后增强的灰度图像');  
	%% 同时增加s1s2 图像比前面增强的图像变白  
	%% 同时减小s1s2 图像比前面增强的图像变黑  
	  
	%% (2)  
	% 显示原图  
	figure;  
	subplot(221);  
	imshow(im1);  
	title('原始灰度图像');  
	subplot(222);  
	imshow(im2);  
	title('增强的灰度图像');  
	%% 增加s1 减小s2  
	% 灰度阈值  
	s1 = 70+30;  
	s2 = 150-30;  
	%   
	im5 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im5(i,j) = t1;  
	        else  
	            im5(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(223);  
	imshow(im5);  
	title('s1增加s2减小后增强的灰度图像');  
	%% 减小s1 增加s2  
	% 灰度阈值  
	s1 = 70-30;  
	s2 = 150+30;  
	%   
	im6 = uint8(zeros(N,M));  
	  
	% 循环判断  
	for i = 1:N  
	    for j = 1:M  
	        if im1(i,j) < s1 || im1(i,j) > s2  
	            im6(i,j) = t1;  
	        else  
	            im6(i,j) = t2;  
	        end  
	    end  
	end  
	subplot(224);  
	imshow(im6);  
	title('s1减小s2增加后增强的灰度图像');  
	  
	%% 增加s1减小s2 图像整体变黑【比(1)的黑更黑】  
	%% 减小s1增加s2 图像整体变白【比(1)的白更白】  

(3)实验结果及分析
实验2题目3的结果如图7、8、9所示。
在这里插入图片描述

图7 实验结果
在这里插入图片描述

图8 实验结果
在这里插入图片描述

图9 第3题运行结果

4. 编程先将一幅灰度图像用3×3平均滤波器平滑一次,再进行如下图10所示增强:

g(x,y)={■(G[f(x,y)]@f(x,y))┤ ■(@)■(G[f(x,y)]≥T@其它)
图10 题4图
其中,G[f(x, y)]是f(x,y)在(x, y)处的梯度;T是非负阈值。
(1)比较原始图像和增强图像,看哪些地方得到了增强;
(2)改变阈值T的数值,看对增强效果有哪些影响。
(1)分析及设计思路
第一步先将灰度图像使用im2double函数转为[0,1]浮点数,然后通过平均滤波平滑,采用的sobel模板如下图11所示,最后通过给定公式进行图像增强。
在这里插入图片描述

图11 Sobel算子
(2)解答及源码
第一问(1)比较原图像和增强图像可得在边缘处得到了增强,因为边缘处梯度大。
第二问(2)改变阀值T后,发现阈值越大,边缘被增强的效果越差。
此程序的源码如下:

clc;  
	clear;  
	close all;  
	%% (1)  
	% 读取图像  
	im = imread('lena.jpg');  
	% 灰度化处理  
	im1 = rgb2gray(im);  
	  
	% 显示原图  
	figure;  
	  
	subplot(221);  
	imshow(im1);  
	title('原始灰度图像');  
	  
	% 图像尺寸  
	[N,M] = size(im1);  
	% 转成[0,1]浮点数  
	im1 = im2double(im1);  
	  
	% 滤波图像  
	im2 = im1;  
	% 循环  平均滤波  
	for i = 2:N-1  
	    for j = 2:M-1  
	        im2(i,j) = sum(sum(im1(i-1:i+1,j-1:j+1)))/9;  
	    end  
	end  
	subplot(222);  
	imshow(im2,[]);  
	title('平均滤波后的灰度图像');  
	  
	% sobel 垂直梯度模板  
	Gx = [1 2 1;0 0 0 ;-1 -2 -1];  
	% sobel 水平梯度模板  
	Gy = [-1 0 1;-2 0 2;-1 0 1];  
	  
	% 阈值  
	T = 0.1;  
	% 增强图像  
	im3 = im2;  
	% 循环判断  
	for i = 2:N-1  
	    for j = 2:M-1  
	        dx = sum(sum(im2(i-1:i+1,j-1:j+1).*Gx));  
	        dy = sum(sum(im2(i-1:i+1,j-1:j+1).*Gy));  
	        G = abs(dx)+abs(dy);  
	        if G >= T  
	            im3(i,j) = G;  
	        end  
	    end  
	end  
	subplot(223);  
	imshow(im3,[]);  
	title('T=0.1增强的灰度图像');  
	  
	%% 边缘处 得到了增强,因为边缘处 梯度大  
	  
	% 阈值  
	T = 2.5;  
	% 增强图像  
	im4 = im2;  
	% 循环判断  
	for i = 2:N-1  
	    for j = 2:M-1  
	        dx = sum(sum(im2(i-1:i+1,j-1:j+1).*Gx));  
	        dy = sum(sum(im2(i-1:i+1,j-1:j+1).*Gy));  
	        G = abs(dx)+abs(dy);  
	        if G >= T  
	            im4(i,j) = G;  
	        end  
	    end  
	end  
	subplot(224);  
	imshow(im4,[]);  
	title('T=2.5增强的灰度图像');  

(3)实验结果及分析
本次实验题目4的结果如图7所示。
在这里插入图片描述

图7 第4题实验结果
通过实验结果可知使用题目给定公式进行增强图像后,图像的边缘处得到了增强,因为边缘处梯度大。当改变阀值T后,发现阈值越大,边缘被增强的效果越差。

5. 图12是线性和非线性混合滤波模板,其中12(a)图的滤波运算如图13所示,请参照给出图12(b)、©两个模板的滤波运算式。

在这里插入图片描述

图12 线性和非线性混合滤波模板
在这里插入图片描述

图13 (a)图滤波运算式
(1)分析及设计思路
通过给定的12(a)图的运算式,可推理得出图12(b)、12©的运算式。
(2)解答及源码
(b)图的滤波运算如下式:
g(x,y)=MED{1/2 [f(x+2,y-2)+f(x+2,y-1)], 1/2 [f(x-1,y+1)+f(x-2,y+2)],f(x,y), 1/2 [f(x-2,y-2)+f(x-1,y-1)], 1/2[f(x+1,y+1)+f(x+2,y+2)]}
©图的滤波运算如下式:
g(x,y)=MED{1/2 [f(x,y-1)+f(x,y-2)+f(x-1,y-2) +f(x+1,y-2)], 1/2 [f(x,y+1)+f(x,y+2)+f(x-1,y+2)+f(x+1,y+2)],f(x,y), 1/2 [f(x-1,y)+f(x-2,y)+f(x-2,y+1)+f(x-2,y-1)], 1/2[f(x+1,y)+f(x+2,y)+f(x+2,y-1)+f(x+2,y+1)]}

  1. 分别使用锐化滤波和高频提升滤波对一幅图像(自备)进行锐化。分别显示原图像、平滑后的图像、锐化滤波图像、高频提升滤波图像,以及最后锐化后的增强图像。
    (1)分析及设计思路
    在锐化滤波中采用sobel算子对图像进行锐化,使用imfilte函数进行平滑处理,自定义函数高频滤波器。
    (2)解答及源码
    此程序的源码如下:
  
	clear;  
	clc;  
	img1=imread('moon.jpg');  
	img=rgb2gray(img1);  
	img=im2double(img);%输入图像类型为uint8,将其转换为double类型进行运算  
	  
	%平滑  
	Inoised = imnoise(img,'gaussian',0.1,0.005);%对图像进行高斯噪声加噪  
	%制定卷积核  
	h=ones(3,3)/5;  
	h(1,1) = 0;  
	h(1,3) = 0;  
	h(3,1) = 0;  
	h(1,3) = 0;  
	%平滑运算  
	I2=imfilter(img,h);  
	  
	  
	%锐化  
	f_average = fspecial('average',[3 3]);  
	f_sobel = fspecial('sobel');  
	f_laplacian = fspecial('laplacian',0);  
	B1 = imfilter(img,f_average);  
	B2 = imfilter(img,f_sobel);  
	B3 = imfilter(img,f_laplacian);  
	  
	figure;  
	  
	subplot(231);imshow(img1);title('原图91703070130');  
	subplot(232);imshow(img);title('原图91703070130');  
	%% 平滑  
	subplot(233);imshow(Inoised);title('添加噪声后的图像');  
	subplot(234);imshow(I2);title('平滑后的图像');  
	%% 锐化  
	subplot(235);imshow(img-B3);title('锐化后的图像');  
	%% 高频率波  
	subplot(236);imshow(strength_filter(img,3));title('高频提升滤波后的图像');  

(3)实验结果及分析
本次实验题目6的结果如图14所示。
在这里插入图片描述

图14 第6题实验结果

7. 右图是一幅受到噪声污染的图像(原始图像见本实验素材),请使用非线性滤波改善其视觉效果。

(1)分析及设计思路
按题目要求采用的是中值滤波器,先是读取图像后检索图像大小并设置为double类型,之后取出图像中与模板对应的数据,将取出数据矩阵变为矢量,计算矢量中值,最后将中值写入中心位置,一共使用33、55、77、99四种模板。
(2)解答及源码
分为两个M文件,程序一是读取图像和展示结果,程序二是中值滤波器。此程序的源码如下:

clear;  
	clc;  
	%% 读入并显示原图  
	figure('name','原图91703070130','NumberTitle','off');  
	J=imread('characters_noise.tif');  
	imshow(J);  
	  
	%% 中值滤波器  
	n=2;    % n=2 选择中值滤波  
	k=1;    % 标识分隔窗口时的窗口号  
	w=1;     
	  
	if w==1||n==2           % MY中值滤波  
	    figure('name','MY中值滤波','NumberTitle','off');  
	    for j=3:2:9  
	        J2=myfilter2('medium',j,J);  
	        subplot(2,2,k);  
	        imshow(J2);  
	        title([num2str(j),'x',num2str(j),'模版']);  
	        k=k+1;  
	    end  
	end  

	%程序二 中值滤波器 
	function Y=myfilter2(type,N,X)  %主函数必须位于最上方  
	switch type  
	    case 'medium'  
	        Y=medium(N,X);  
	    otherwise  
	        Y=X;  
	end % /!switch   
	end % /!function Y=myfilter2(type,N,X)  
	           
	%% medium  
	% 中值滤波器,模版为NxN  
	function I=medium(N,X)  
	    [height,width]=size(X);     % 检索图像大小  
	    dX=double(X);               % 保存计算后的图像(double类型)  
	    for i=1:height-N+1  
	        for j=1:width-N+1  
	            temp=X(i:i+(N-1),j:j+(N-1));    % 取出图像中与模版对应的数据  
	            s=temp(:);                      % 将矩阵转变为一个矢量  
	            med=median(s);                  % 计算矢量的中值  
	            dX(i:i+(N-1)/2,j:j+(N-1)/2)=med;% 将中值写入中心位置  
	        end  
	    end  
	    I=uint8(dX);  
	end % /! function I=medium(N,X)     

(3)实验结果及分析
本次实验题目7的结果如图15、16所示。
在这里插入图片描述

图15 原图
在这里插入图片描述

图16 第7题实验结果

四 心得体会

这是第二次图像处理实验,很明显感觉得到这一次题的难度比上次提升了许多,导致我在第6题就花费了很多的时间,值得欣慰的是最后还是做出来了,马上临近期末,这门课也要走向尾声,期待后面的大作业和学习。

Logo

获得宣传、场地、资金和创业导师资源

更多推荐