遥感图像滤波处理

来源:互联网 发布:excel表格数据求和为0 编辑:程序博客网 时间:2024/05/16 03:43

在遥感影像处理中,为了抑制噪声,我们需要对影像进行滤波处理,滤波的方法有很多,不同的滤波有不同的作用,像遇到的大部分方法一样,每种方法也都有其优缺点,我实现的滤波有:中值滤波、3*3窗口的自定义滤波、索伯尔(Sobel)滤波、5*5窗口的自定义滤波五种。

3*3窗口和5*5窗口原理一样,就是窗口大小不同而已。

在MFC实现的过程中,在响应菜单下弹出一个对话框,对话框的类定义在***View.h下面,在菜单函数下定义对话框的类,然后弹出。

在进行选择之后,弹出响应的滤波对话框,在第一篇博客中就提到,我的程序模块化是用对话框来进行的。所以每个滤波方法对应一个对话框,下面的对话框是3×3窗口自定义滤波和索伯尔(Sobel)滤波对应的对话框,它们之间是独立的。

下面,我分别介绍各类滤波算法的实现过程:

一、3*3窗口自定义滤波:

1、原理:自定义滤波,是指将3*3共9个窗口的值乘以权重加起来,然后除以9作为中心的值(这也是为什么大多数的窗口选择都是奇数,因为只有奇数才有正中心,4*4的窗口是没有中心的)。

2、优点:这样的滤波,个人认为可以自己根据需要进行定制,使用起来比较灵活。

3、缺点:因为在自定义滤波内部的算法只是一个求和的过程,像索伯尔(Sobel)这样需要计算x和y两个方向的滤波器和中值滤波这样需要进行排序的滤波器,就受限于自定义滤波的求和算法;当然这个缺点是由程序实现算法本身导致的。还有一个缺点就是定制繁琐,这个缺点是由自定义滤波应用方式决定的。

4、程序实现步骤:

(1)首先,通过GDAL获取各个像素点的值,因为我们所有的算法都是对图片中像元值进行处理,所以获取到像素值当然是第一步(除去配置GDAL、准备数据那些,这里说的是Coding的第一步)。通过GDAL的函数就可以获取到像素点的值,无论是Byte类型还是Float类型的,都可以获取到其值,只是float类型的就是0.0~255.0的值,所以我直接用float类型( 在GDAL里面是GDT_Float32,其余的类型可以参照GDAL手册)去获取像素值,获取像素值的函数如下(各个变量定义在***View.h中):

这样,所有的像素值就都放在了pafScanblock里面了,pafScanblock相当于一个数组,其值的获取方式与普通数组一样。

(2)将像素值读在了数组里面,下面就是对这些像素值进行处理,这个地方用到的就是教材中讲到的算法,算法才是程序核心,在滤波的时候,获取对话框下面的编辑框里的值,然后将编辑框里的值分别乘以对应位置的影像像元值,一个波段计算一次,几个波段就计算多少次(波段数目、影像X和Y可以通过GDAL的函数进行获取,X乘以Y即是每个影像波段的大小)。

因为窗口是3*3的,所以左上角的影像值乘以3*3窗口对话框中的左上角的位置,其余位置对应相乘,然后除以9;就可以得到滤波后的结果,也就是需要3个循环,分别是波段数目的循环,X方向的循环,Y方向的循环。具体算法实现如下(边缘的部分我是保留其原来的值,这个是稍微偷懒的方法,应该是将影像左右边缘向左向右复制一下,然后进行操作,window*_*指的是某个窗口的值):

最后一行代码是写入,pDstDS是输出的影像,就是把每个处理后的波段都写入到影像中,pDstDS输出文件的建立如下(ImgPath是输入文件的路径):

写入后的名字就是pDstDS = poDriver->Create后面的引号里的"pinghua3_3.tif"文件。

至此,3*3窗口滤波的算法及其实现已经全部介绍完毕。


二、中值滤波:

1、原理:中值滤波的原理,也很简单,就是把3*3共9个窗口里的值排个序,然后取最中间的那个数作为中间值,至于排序,记得学C++第一个接触的可以称之为算法的东西就是冒泡排序。中值滤波能够很好的去除噪声也是非常好理解的,因为噪声点要么值大的不行,要么就是小的不行,总不会在中间,所以取中间值就可以很好的去除掉噪声。

2、优点:能够保持变化比较大的部分。

3、程序实现:

(1)第一步当然也是获取像素值,在此就不一一赘述了。

(2)通过冒泡排序的方法对3*3共9个像素位置的像素值进行排序,取中间的结果作为中间像元的值,左右边界的值也是向左向右进行复制,然后进行中值滤波操作。中值滤波的核心代码如下:

3)输出文件:

输出文件pDstDS与3*3自定义滤波中的输出的方法一样,就是名字需要改变下(不改变两种算法的结果会重写)。

至此,中值滤波的算法介绍完毕。


三、索伯尔(Sobel)滤波:

索伯尔滤波是可以说是听起来最高大上的滤波了,当然它的计算过程也比较复杂一点点,不过也相对前面两个而言,相对于一些更复杂的滤波器,也是基础而已。

1、原理:通过一个卷积模板,将边缘的值扩大,将中间的值变成0,从而将边缘值扩大,实现边缘扩大。其使用的卷积模板如下,左侧是X方向,右侧是Y方向(X方向和Y方向的值计算方式与自定义滤波相同,对应位置的乘积之和),然后将X方向计算值的平方与Y方向计算值的平方相加,再求算术平方根,作为中间像素点的值。

2、优点:突出变化比较迅速的信息(即高频信息)

3、缺点:减弱了低频信息。

4、核心代码实现:

输出文件和输入文件与前面一致,在此不一一赘述。

至此,索伯尔滤波介绍结束。


所有的滤波器都是对于值的操作,只是我们在处理时要根据不同的数学公式进行处理,代码的核心还是算法,算法是需要很多知识相互结合,数学基础,算法原理,图像处理的知识,复杂的一些,可能涉及的知识更多,而编程显示出来结果,我认为属于技术问题,当我们掌握的技术越多,我们处理事情的时候效率也就越高,这点毋庸置疑。所以要多了解学习一些技术,在遇到算法问题时多思考,我想,写出一些简单的代码还是不成问题哒。


1 0
原创粉丝点击