数字图像处理课程设计文档格式.docx
《数字图像处理课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《数字图像处理课程设计文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
空间滤波主要包括平均滤波、中值滤波、最大值滤波、最小值滤波等。
空间滤波是通过空间滤波器实现。
空间滤波器就是在一个邻域(如包围该像素的一个小矩形区域)里,对该邻域包围的像素的进行操作。
空间滤波器包括线性滤波器如:
线性操作,如加、减、乘运算;
非线性滤波器如:
非线性操作。
空间滤波器又叫模板,类似于矩阵,大小有3*3模板、5*5模板、9*9模板等。
如:
9*9模板:
空间滤波对图像的增强处理主要是通过模板运算实现的,按照指定的模板进行运算。
如右图,是对模板运算的
的图示解释。
模版运算实现的主要步骤:
1、将模板在图中遍历,并将模板中心与图中某个像素位置重合;
2、将模板上的各个系数与模板下的各对应像素的灰度值相乘;
3、将所有乘积相加;
4、将上述运算结果赋给模板中心位置的像素。
最大值滤波、最小值滤波的原理:
设输出的图像为g(x,y),
(s-1,t-1)
(s-1,t)
(s-1,t+1)
(s,t-1)
(s,t)
(s,t+1)
(s+1,t-1)
(s+1,t)
(s+1,t+1)
最大值滤波
最小值滤波
实验内容:
1,在XX图库中寻找一张图片:
2,在Photoshop中,将图片改为宽300像素,高300像素的图片,模式保存为RGB,8位/通道,格式为bmp,保存在D盘中,命名为:
myimge;
3,打开TestVC.dsw工程文件,再打开mytest.cpp文件,在指定位置输入程序
4,编译,调试,运行。
实验结果:
一、利用for循环编写代码;
1.1最大值滤波for循环主要代码:
voidCTestVCView:
:
test(BYTEinimage[300][300],BYTEoutimage[300][300])
{
inti,j,max;
for(i=1;
i<
300;
i++)
{
for(j=1;
j<
j++)
{
max=inimage[1000][1000];
if(inimage[i][j]>
max)
{
max=inimage[i][j];
}
outimage[i][j]=max;
}
}
}
1.2代码截图:
1.3输入图像(左),输出图像(右);
2.1最小值滤波for循环主要代码;
inti,j,min;
min=inimage[1000][1000];
if(inimage[i][j]<
min)
min=inimage[i][j];
outimage[i][j]=min;
2.2代码截图;
2.3实验的输入图像如下图左,处理图像如下图右:
二、利用for、、、if判断语句进行编码;
1.1最大值滤波的主要编码;
{
max=inimage[i][j];
if(inimage[i-1][j]>
max=inimage[i-1][j];
if(inimage[i-1][j-1]>
max=inimage[i-1][j-1];
if(inimage[i-1][j+1]>
max=inimage[i-1][j+1];
if(inimage[i][j-1]>
max=inimage[i][j-1];
if(inimage[i][j+1]>
max=inimage[i][j+1];
if(inimage[i+1][j-1]>
max=inimage[i+1][j-1];
if(inimage[i+1][j]>
max=inimage[i+1][j];
if(inimage[i+1][j+1]>
max=inimage[i+1][j+1];
1.2编码截图:
1.3实验输入图像(左)输出图像(右)
2.1最小值滤波的主要编码;
for(i=1;
min=inimage[i][j];
if(inimage[i-1][j]<
min=inimage[i-1][j];
if(inimage[i-1][j-1]<
min=inimage[i-1][j-1];
if(inimage[i-1][j+1]<
min=inimage[i-1][j+1];
if(inimage[i][j-1]<
min=inimage[i][j-1];
if(inimage[i][j+1]<
min=inimage[i][j+1];
if(inimage[i+1][j-1]<
min=inimage[i+1][j-1];
if(inimage[i+1][j]<
min=inimage[i+1][j];
if(inimage[i+1][j+1]<
min=inimage[i+1][j+1];
2.2编码截图;
2.3,实验输入图像(左)输出图像(右)
编码分析
如右图,可以令图像中某一象素的位置坐标为(s,t),其邻域象素的坐标位置就如右图所示,因为在图像中象素的坐标位置为二维数组,若用I,j代表s,t,则这九个点在程序输入是的代码为
inimage[i-1][j]
inimage[i-1][j-1]
inimage[i-1][j+1]
inimage[i][j-1]
inimage[i][j]
inimage[i][j+1]
inimage[i+1][j-1]
inimage[i+1][j]
inimage[i+1][j+1]
在最大值滤波中,只需要找出这九个位置的象素中灰度值最大的象素,即若赋值(s,t)位置的象素灰度值最大(max=inimage[i][j]),只需要将另外八个位置象素的灰度值与其进行大小比较,若大于inimage[i][j],则将其灰度值赋值于max,再将其他位置的象素灰度值与其进行比较,直至找出这九个位置象素中灰度值最大的那个象素,然后将其灰度值代替中心象素(s,t)位置的象素灰度值。
在最小值滤波中,只需要找出这九个位置象素中灰度值最小的象素,若赋值(s,t)位置的象素灰度值最小(min=inimage[i][[j]),只需要将另外八个位置象素的灰度值与其进行大小比较,若小于inimage[i][j],则将其灰度值赋值于min,再将其他位置的象素灰度值与其进行比较,直至找这九个位置象素中灰度值最小的那个象素,然后再将其灰度值代替中心象素(s,t)位置的象素位置。
在编码过程中无论是使用for循环语句还是使用for、、、if,其编码原理都大致如此,只不过for循环语句比较简单,但是for循环的语句中,因为在所有的数组中,其灰度值的范围是是[1300],所以在对最大值max进行赋值时一定要赋予一个最小的数,目的就是为了让图像中所有象素的灰度值都大于max,这样就可以让所有象素与max进行循环比较;
对最小值min进行赋值时一定要赋予一个最大的数,目的就是为了让图像中所有象素的灰度值都小于min,这样就可以让所有的象素与min进行循环比较。
用For、、、if语句进行编码虽然麻烦,但是读起来比较易懂,先把九个像素位置的灰度值表示出来,然后用所有象素的灰度值与其中一个象素灰度值逐依进行比较,直至得出最大灰度值象素或最小灰度值象素。
实验收获:
在这次小学期中,我对C语言有了更加深入地学习,而且初步对VC++有了了解,将程序设计与图像处理很好的结合,在之前一直用PS等作图软件对图像进行处理的基础上,也简单的学会了用C语言、VC++等程序对图像进行数字化处理。
这次小学期的主要任务是对图像进行增强处理,主要是运用最大值滤波、最小值滤波对图像进行操作。
通过学习,不仅深入了解了图像增强处理的方法和技巧,而且也对滤波有了更深入的了解,尤其是最大值滤波、最小值滤波、中值滤波、均值滤波等。
在利用程序编码对其进行操作时,也对程序编码有了更深入的了解。
附注:
编码执行流程图,见下页。
程序执行流程图
(以for循环最小
值滤波为例)