2019武大国重考研地理信息系统专硕(测绘工程/资源与环境)(GIS)复试上机题目分享
1.前言
有天晚上睡不着,突然想起来考研复试上机的题目到现在都没解决,于是开始回忆当时的解法,并思考新的思路。想不到的是很快有了一个自己认为还不错的方案,起码相对于当时的解法。在此记录。
2.题目要求
原题目要求用C语言实现均值滤波算法,已经给出的是整个项目工程,其中函数,头文件,数据都已经写好了(数据是一个8×8的二维数组),用VS打开可以直接运行。我们需要做的就是在两个函数里面填代码实现功能。第一个函数实现模板为3×3的均值滤波,第二个则进行通用化,实现n*n大小的均值滤波。
个人认为题目还是比较简单的,只要会基础的C语法,把思路描述出来就好了。甚至只写注释都是会给分的,下来之后分数也普遍偏高,所以你懂的,并不是越好的学校会越为难大家。
3.新旧思路
3.1旧思路
考虑到对数据中间部分和边界滤波是不同的,因为中间的一部分可以直接查找周围的数值求和并平均,而边界上的值是缺的,比如第一行数据缺了上面的一行,最后一行缺了最下面一行。其中每一行列的情况也不同,以8×8数组为例,(0,0)和(0,7)一个左边缺一个右边缺。所以对数据分情况讨论。大概分成最中间部分 + 4个顶点 + 4条边界 9部分,依据每一类的不同情况计算相应的和。
这种思路还是比较复杂的,当时两个小时3×3模板的基本做完了,N×N模板的只做了一半,因为没时间了。
3.2新思路
考虑到均值滤波在边界处需要进行填充后操作,突然想到如果填充成一个新的数组,即把边界扩充,原数组的大小正好是现数组可以直接进行求和的大小,在这个数组上进行操作,那不是就不用分情况了!
为了方便理解,我放出原始数组和扩充后的数组图片。这里边界全部是0,还没有填充,可以直观对比。
下一步就是对边界填充实际数值了,这也是有点麻烦的一步。如果是边界0填充的方式,那就简单很多了,省下一半工作。而现在使用最邻近边填充的话,仍然需要分情况对其赋值。这里就不展开讲了,主要是分上下左右4种情况,具体看最后的代码吧
4. 总结
这个小代码还是很有趣的,对我来说有点意义。如果能帮到其他人就更好了大佬们有其他意见欢迎指点!目前没有优化,有些地方是不够简洁的。另外,还没有参考网上其他人的解决方案,等后面再补充。
5.全部代码
import numpy as np
# 创建一个数组,用来进行均值滤波
n = 8
arr = np.zeros((n, n))
for i in range(n):
for j in range(n):
arr[i, j] = i + j*j
print('原数组----------')
print(arr)
# 均值滤波算法。array为计算的数组,d为滤波模板的长度(d*d),d为奇数
def filtering(array, d):
# 首先对原始数组进行扩充,以相邻边的值填充边界
new_arr = np.zeros((len(array)+int(d/2)*2, len(array)+