1 实验目的
理解图像平滑和锐化的基本方法;
了解图像复原的基本方法;
综合使用多种方法改善图像质量。
2 实验要求
(1)利用Photoshop之类的图像处理工具软件,尝试对Moon.bmp尽量改善图像质量。
(2)综合采用各种合理的方法,编写程序(C/C++/OpenCV、MATLAB、Python……均可)对Moon.bmp进行图像质量改善,实现以下目标的权衡折中:
a.降低噪声;
b. 增大对比度;
c. 锐化增强。
3 实验设备
安装了相关软件的PC机
4 实验原理
介绍和本实验紧密相关的背景知识
空间滤波基础
图像的平滑、锐化都是利用掩模操作来完成的,通过掩模操作实现一种邻域运算。待处理像素点的结果由它的邻域像素以及与邻域相同大小的子图像得到,这些子图像被称为滤波器、掩模、核、模板或窗口, 滤波器子图像中的值是系数.
掩模运算的数学本质是卷积(或互相关)运算。
前述处理可描述为:
在待处理图像中逐点地移动掩模,每点的响应由滤波器掩模系数与滤波掩模扫过的相应像素值的乘积之和给出。 (空域线性滤波)
一般来说,在M×N的图像f上,用m×n大小的滤波器掩模w进行线性滤波由下式给出:
其中 a=(m-1)/2且b=(n-1)/2, 处理的掩模长与宽都为奇数。
此处理本质为模板与图像的卷积,滤波掩模也称为卷积模板、卷积核。
为得到一幅完整的经过滤波处理的图像,必须对 x=0,1,…,M-1 和 y=0,1,…,N-1 依次应用上式。
简化表达形式:
3×3的掩模结果:
均值滤波的话用到的掩模式这个
相当于求这几个位置上的数的平均值。
而中值滤波就是要求这九个数的值得中值。
锐化处理
由于我们处理的是数字量,最小灰度级的变化是有限的,而且变化发生的最短距离是在两个相邻像素之间。因此,
用差值定义一元函数f(x)一阶微分:
用一阶微分的差值定义一元函数f(x)的二阶微分:
基于二阶微分的图像增强 —— 拉普拉斯算子
二元图像函数f(x,y)的拉普拉斯变换定义为:
离散方式:
x方向
y方向
故二维拉普拉斯数字实现由以上两个分量相加:
实现拉普拉斯变换的滤波器掩模:
1执行离散拉普拉斯变换所用的滤波器掩模
2扩展的拉普拉斯变换掩模,包括了对角邻域
3和(d) 其他两种拉普拉斯变换的实现
对比度
5.1 总体设计
描述你的程序中各模块(函数)功能、入口参数、返回值、调用与被调用情况;
给出你的主程序流程图,以及主要模块(函数)的流程图(中等复杂度的流程图)。
我没有使用ps对图片编辑,我直接在moon_pocession.m函数里面调用那些函数对函数进行处理关于显示滤波还是锐化还是对比度,直接复制粘贴函数就行了,还挺快的,感觉不需要ps的辅助。
5.2 详细设计
给出主要实现代码,代码必须有适当的注释说明。
不能只有代码和注释,而应有相应的文字或配图说明,详细解释设计细节。
moon_pocession.m文件
这是我调试过多次之后得出来的最终配置
函数之外我会单独分析各个调用的函数的处理结果
im =imread('Moon.bmp');
figure(1);
imshow(im);
[r,c,t]=size(im);
%均值滤波处理
[im1]=average_filter(im);
%一阶锐化,我调试时候发现二阶锐化效果并不好
[im1]=laplacian_once(im1);
%这个是我做对比度时候用到的两个参数,为了修改方便,我直接给他赋值
umin=0.39;
umax=0.75;
%im1=imadjust(im1,[0.07 0.83],[0 1]);
%im1=imadjust(im1,[0.13 0.80],[0 1]);
%im1=imadjust(im1,[0.29 1],[0 1]);
%对比度调节
im1=imadjust(im1,[umin umax],[0 1]);
%---------------------------------
% RR=im(:,:,1);GG=im(:,:,2);BB=im(:,:,3);
% RR=histeq(RR); GG=histeq(GG); BB=histeq(BB);
% im1=RR;im3(:,:,2)=GG;im3(:,:,3)=BB;
%---------------------------------
figure(3);
%最终处理结果显示
imshow(im1);
title([num2str(umin) ,'到',num2str(umax),'的对比度调节']);
先均值滤波的结果
对先前均值滤波后再进行一阶锐化
最后对比度调节,本人选择了0.39到0.75的参数,下面我会写出我的其他参数测试
为了单独测试每个函数,我新建了一个处理文件单独去测试各个函数独立作用的结果
middle_filter.m
function [im1]=laplacian_once(im)
im=imread('Moon.bmp');
[r,c,t]=size(im);
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
for j=1:c-2
for i=1:r-2
x=[R(i,j) R(i+1,j) R(i+2,j) R(i,j+1) R(i+1,j+1) R(i+2,j+1) R(i,j+2) R(i+1,j+2) R(i+2,j+2)];
R1(i+1,j+1)= median(x);
end
end
for j=1:c-2
for i=1:r-2
x=[G(i,j) G(i+1,j) G(i+2,j) G(i,j+1) G(i+1,j+1) G(i+2,j+1) G(i,j+2) G(i+1,j+2) G(i+2,j+2)];
G1(i+1,j+1)= median(x);
end
end
for j=1:c-2
for i=1:r-2
x=[B(i,j) B(i+1,j) B(i+2,j) B(i,j+1) B(i+1,j+1) B(i+2,j+1) B(i,j+2) B(i+1,j+2) B(i+2,j+2)];
B1(i+1,j+1)= median(x);
end
end
im1=R1;
im1(:,:,2)=G1;
im1(:,:,3)=B1;
figure(2);
imshow(im1);
我这个中值滤波函数自己写的,执行的时候比较花时间,所以我滤波都是使用均值滤波,因为那个运行比较快。
这个函数单独处理的结果是
average_filter.m均值滤波文件
function [im1]=average_filter(im)
%im =imread('Moon.bmp');
% figure(1);
% imshow(im);
[r,c,t]=size(im);
%================================================================
%均值滤波
%================================================================
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
% Rhat = medfilt2(R,[3,3]);
% Ghat = medfilt2(G,[3,3]);
% Bhat = medfilt2(B,[3,3]);
for j=1:c-2
for i=1:r-2
R1(i+1,j+1)=(R(i,j)/9+R(i+1,j)/9+R(i+2,j)/9+ R(i,j+1)/9+R(i+1,j+1)/9+R(i+2,j+1)/9+ R(i,j+2)/9+R(i+1,j+2)/9+R(i+2,j+2)/9);
end
end
for j=1:c-2
for i=1:r-2
G1(i+1,j+1)=(G(i,j)/9+G(i+1,j)/9+G(i+2,j)/9+ G(i,j+1)/9+G(i+1,j+1)/9+G(i+2,j+1)/9+ G(i,j+2)/9+G(i+1,j+2)/9+G(i+2,j+2)/9);
end
end
for j=1:c-2
for i=1:r-2
B1(i+1,j+1)=(B(i,j)/9+B(i+1,j)/9+B(i+2,j)/9+ B(i,j+1)/9+B(i+1,j+1)/9+B(i+2,j+1)/9+ B(i,j+2)/9+B(i+1,j+2)/9+B(i+2,j+2)/9);
end
end
im1=R1;
im1(:,:,2)=G1;
im1(:,:,3)=B1;
figure(1);
imshow(im1);
imwrite(im1,'average_filter_Moon.bmp');
title('均值滤波');
%------------------------------------------------------------------------------
这个均值滤波和中值滤波效果都差不多,而且这个运行比较快,所以我在主函数里面主要采用这种滤波。
laplacian_once.m一阶锐化
function [im1]=laplacian_once(im)
%im=imread('Moon.bmp');
%im=imread('average_filter_Moon.bmp');
[r,c,t]=size(im);
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
for j=2:c-1
for i=2:r-1
imR(i,j)=R(i,j)-(R(i+1,j)+R(i,j+1)-R(i,j)*2);
end
end
for j=2:c-1
for i=2:r-1
imG(i,j)=G(i,j)-(G(i+1,j)+G(i,j+1)-G(i,j)*2);
end
end
for j=2:c-1
for i=2:r-1
imB(i,j)=B(i,j)-(B(i+1,j)+B(i,j+1)-B(i,j)*2);
end
end
im1=imR;
im1(:,:,2)=imG;
im1(:,:,3)=imB;
figure(2);
imshow(im1);
title('一阶锐化');
laplacian_twice二阶锐化函数
function [im1]=laplacian_twice(im)
%im=imread('Moon.bmp');
im=imread('average_filter_Moon.bmp');
[r,c,t]=size(im);
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
for j=2:c-1
for i=2:r-1
imR(i,j)=R(i,j)-(R(i-1,j)+R(i+1,j)+R(i,j+1)+R(i,j-1)-R(i,j)*4);
end
end
for j=2:c-1
for i=2:r-1
imG(i,j)=G(i,j)-(G(i-1,j)+G(i+1,j)+G(i,j+1)+G(i,j-1)-G(i,j)*4);
end
end
for j=2:c-1
for i=2:r-1
imB(i,j)=B(i,j)-(B(i-1,j)+B(i+1,j)+B(i,j+1)+B(i,j-1)-B(i,j)*4);
end
end
im1=imR;
im1(:,:,2)=imG;
im1(:,:,3)=imB;
figure(2);
imshow(im1);
对比度调节
umin=0.39;
umax=0.75;
im1=imadjust(im1,[umin umax],[0 1]);
然后我是对他们通过多次的调用得出最终的结果的。下面会介绍各种测试结果。
6 测试与分析
给出测试步骤、测试数据、测试图片等,分析测试结果。
测试步骤很简单,打开moon_pocession.m文件点击运行就好,修改里面的函数调用顺序和次数就可以了。然后多次测试之后,我采用了均值滤波,因为他的效果和中值滤波差不多,而且他速度快。
再来就是在锐化时候我采用了一阶锐化,在上面的作用很明显看出来一阶滤波效果太过了,把噪声都放大了,但是,那只是在有噪声的情况下的结果,而在滤波以后的话,采用一阶效果会很好,把边边都会区分得比较明显,采用二阶锐化的话效轮廓没有那么清晰地显示出来,所以我是采用一阶锐化。从下面的图很容易看出来,一阶效果稍稍好一点。
然后我多次实验后,最终决定调用的顺序是这样的,其中x,y是要修改的参数
[im1]=average_filter(im);%先滤掉噪声,避免锐化时候把噪声放大了
[im1]=laplacian_once(im1);
umin=x;
umax=y;
im1=imadjust(im1,[umin umax],[0 1]);
下面的调试结果之中,前面的处理都是一样,都是先均值滤波,再二阶锐化
直方图均衡化后的处理结果
7 结论与问题讨论
总结完成设计要求的程度、遇到的问题及解决办法、存在的不足及改进思路。
设计要求基本完成
(1)就是没有利用Photoshop之类的图像处理工具软件,尝试对Moon.bmp尽量改善图像质量。因为我觉得没有必要,我可以直接对图片进行处理,觉得也挺快的。
(2)综合采用各种合理的方法,编写程序MATLAB对Moon.bmp进行图像质量改善,实现以下目标的权衡折中:
a.降低噪声;我用了均值滤波和中值滤波两种方法实现
b. 增大对比度;增大对比度的话公式已经写出来了,这里我调用了函数
c. 锐化增强。锐化我也写了一阶和二阶的锐化。
在试验过程中我发现有个问题,就是彩色图片做处理的时候,如果是直接对图片rgb原色同时处理的话出来的图片失真度很大,要把它分为三个rgb值储存起来才不会有问题,理论上那个两种都可以的,单不知为什么实验就是有问题。
就是我函数写成这样的话,理论上是没问题的,但是结果就是那么奇葩。
im =imread('Moon.bmp');
figure(1);
imshow(im);
[r,c,t]=size(im);
%=================================================
%³õ´Î³¢ÊÔÖÐÖµÂ˲¨
%=================================================
fork=1:t
forj=1:c-2
fori=1:r-2
% im1(i+1,j+1,t)=(im(i,j,t)+im(i+1,j,t)+im(i+2,j,t)+ im(i,j+1,t)+im(i+1,j+1,t)+im(i+2,j+1,t)+ im(i,j+2,t)+im(i+1,j+2,t)+im(i+2,j+2,t))/9;
im1(i+1,j+1,t)=(im(i,j,t)/9+im(i+1,j,t)/9+im(i+2,j,t)/9+ im(i,j+1,t)/9+im(i+1,j+1,t)/9+im(i+2,j+1,t)/9+ im(i,j+2,t)/9+im(i+1,j+2,t)/9+im(i+2,j+2,t)/9);
end
end
end
figure(2);
imshow(im1);
%--------------------------------------------------
后来把数据存到了三个变量里面就好了
[r,c,t]=size(im);
%================================================================
%把变量存到三个变量里面,分别对他们呢处理
%================================================================
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
还有下面是我实验过程中保存过的成功或失败的代码
im =imread('Moon.bmp');
figure(1);
imshow(im);
[r,c,t]=size(im);
%=================================================
%初次尝试中值滤波
%=================================================
% % for k=1:t
% % for j=1:c-2
% % for i=1:r-2
% % % im1(i+1,j+1,t)=(im(i,j,t)+im(i+1,j,t)+im(i+2,j,t)+ im(i,j+1,t)+im(i+1,j+1,t)+im(i+2,j+1,t)+ im(i,j+2,t)+im(i+1,j+2,t)+im(i+2,j+2,t))/9;
% % im1(i+1,j+1,t)=(im(i,j,t)/9+im(i+1,j,t)/9+im(i+2,j,t)/9+ im(i,j+1,t)/9+im(i+1,j+1,t)/9+im(i+2,j+1,t)/9+ im(i,j+2,t)/9+im(i+1,j+2,t)/9+im(i+2,j+2,t)/9);
% % end
% % end
% % end
% %
% % figure(2);
% % imshow(im1);
%--------------------------------------------------
%================================================================
%
%================================================================
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
Rhat = medfilt2(R,[3,3]);
Ghat = medfilt2(G,[3,3]);
Bhat = medfilt2(B,[3,3]);
for j=1:c-2
for i=1:r-2
R1(i+1,j+1)=(R(i,j)/9+R(i+1,j)/9+R(i+2,j)/9+ R(i,j+1)/9+R(i+1,j+1)/9+R(i+2,j+1)/9+ R(i,j+2)/9+R(i+1,j+2)/9+R(i+2,j+2)/9);
end
end
for j=1:c-2
for i=1:r-2
G1(i+1,j+1)=(G(i,j)/9+G(i+1,j)/9+G(i+2,j)/9+ G(i,j+1)/9+G(i+1,j+1)/9+G(i+2,j+1)/9+ G(i,j+2)/9+G(i+1,j+2)/9+G(i+2,j+2)/9);
end
end
for j=1:c-2
for i=1:r-2
B1(i+1,j+1)=(B(i,j)/9+B(i+1,j)/9+B(i+2,j)/9+ B(i,j+1)/9+B(i+1,j+1)/9+B(i+2,j+1)/9+ B(i,j+2)/9+B(i+1,j+2)/9+B(i+2,j+2)/9);
end
end
im1=R1;
im1(:,:,2)=G1;
im1(:,:,3)=B1;
figure(2);
imshow(im1);
%------------------------------------------------------------------------------
%=============================================================================
%书本上代码
%=============================================================================
%N =imnoise(im,'salt & pepper',3e-1);
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
Rhat = medfilt2(R,[3,3]);
Ghat = medfilt2(G,[3,3]);
Bhat = medfilt2(B,[3,3]);
Ihat=Rhat;
Ihat(:,:,2)=Ghat;
Ihat(:,:,3)=Bhat;
figure(3);
imshow(Ihat);
%-------------------------------------------------------------------------------
%==================================================================================
%4x4均值滤波
%==================================================================================
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
Rhat = medfilt2(R,[4,4]);
Ghat = medfilt2(G,[4,4]);
Bhat = medfilt2(B,[4,4]);
Ihat=Rhat;
Ihat(:,:,2)=Ghat;
Ihat(:,:,3)=Bhat;
figure(4);
imshow(Ihat);
%------------------------------------------------------------------------------------
实验过程中相对以前来说还是挺顺利的,没有太大的障碍,觉得不足之处的话就是没有尝试fir iir滤波器的滤波效果,没有尝试更多的滤波锐化效果,其他的话还好。在做锐化和对比度的话都是看完书就懂了,原理也很清晰,没有多大的问题,所以总体来说难题不多。
8 参考文献
[1]《数字图像处理》第3章.ppt[DB(DB/OL)] .
[2]吴镇扬,周琳 等(译).数字信号与图像处理(翻译版)[M]. 北京:高等教育出版社,2006:551-685 .
领取专属 10元无门槛券
私享最新 技术干货