重庆理工大学图像处理实验二:图像增强
实验2:图像增强一 实验目的和要求理解图像灰度映射的原理。掌握MATLAB编程实现图像灰度映射的方法理解直方图均衡的原理掌握MATLAB中用直方图均衡改善图像的方法理解空间滤波的种类和方法掌握使用MATLAB中的空间滤波增强图像的方法了解傅里叶变换及频域滤波原理掌握使用MATLAB中的频域滤波增强图像的方法二 实验环境操作系统环境:windows 10开发工具:MATLAB R2018b其它辅助工
实验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所示直方图,请用手工方法列表计算该直方图的均衡化直方图。
图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题实验结果
- 收集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)分析及设计思路
在锐化滤波中采用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题就花费了很多的时间,值得欣慰的是最后还是做出来了,马上临近期末,这门课也要走向尾声,期待后面的大作业和学习。
更多推荐
所有评论(0)