过了一个多月, 总算将上学期遗留下来的考试总算考完了, 终于找到了一个时间来好好地把我上学期的做过的一些项目好好总结一下了.
首先先把数据结构的一些项目总结一下.
一些相关的前置知识可以见:
一、项目简况:
四叉树, 又称四元树, 是一种树状数据结构. 四叉树常应用于二维空间数据的分析与分类. 本实验希望同学们通关运用四叉树对图像进行模糊处理, 考察同学们对树型数据结构的掌握情况, 以及让同学们对数据结构在实际问题中的运用有一个更加直观的认识
实验要求:
能够正确的对图像建立四叉树
对于输入的图像, 四叉树能够输出模糊的结果
对颜色相近的区域进行模糊
在这里, 我自己通过查阅文献学习到了两种对图像进行模糊处理的方法: 均值模糊以及高斯模糊.
注: 在这里我仅仅提供一下我自己的思路和实验心得, 方法当然不一定是最优, 如代码中仍存在bug欢迎指正. 也十分欢迎如果有更好的图像模糊方法来和我一起交流.
二、项目分析:
首先我们肯定得先思考四叉树的数据结构是怎样的, 联系我们学到的二叉树数据结构, 可以仿照我们的二叉树数据结构来建立四叉树数据结构
四叉树是树, 那就肯定有子树: 左上子树 - 左下子树 - 右上子树 - 右下子树
其次, 由于我们需要遍历一块区域来对该区域的RGB值进行模糊处理, 那么我们就需要对应一块区域所需要的坐标: 左坐标 - 右坐标 - 上坐标 - 下坐标
其实考虑到这儿, 基本上四叉树的数据结构我们已经考虑的差不多了, 如果后续还需要更多的关于四叉树的信息, 可以在此基础上进行增添.
其次, 我们肯定得思考四叉树的建立. 其实四叉树本质上还是树型结构, 而树状数据结构显然是可以使用递归来求解的. 因此我们考虑使用递归的方法来建立四叉树.
对于递归算法, 最重要的是需要一个结束出口, 那么结束出口我们应该怎么设置呢?
首先我们可以想到, 一个图片的RGB区域可以无限递归下去吗? 显然是不行的, 这时我们可以设定一个递归结束出口. 当该区域为1*1时此时无法继续递归, 所以可将此时设定为一个递归出口. 但是只有这一个出口吗? 显然不是的, 这样显然不可以对图像达到模糊的效果, 因为最后都无法与周围区域进行作用, 这时就需要我们继续读题.
读完题目, 注意到题目中提到对颜色相近的区域进行图像模糊处理, 通过这句话我们当然就可以知道递归的结束出口了: 显然就是当一个区域内部的方差小于我们设定的标准值时此时我们可以结束递归了
最后, 四叉树建立完毕之后就可以对图像进行模糊处理了
均值模糊
顾名思义就是对一块区域的RGB值求平均值, 并使得该区域所有的RGB值均赋值为均值
当然, 这种模糊方法存在一定的局限性: 利用均值取代区域内所有点的RGB值显然会使得图像不够圆滑 (虽然我没太看出来模糊出来的图片哪儿不够圆滑)
高斯模糊
本质上就是运用正态分布函数对图形进行模糊处理
在这里由于每部分区域的大小不一, 所以我进行了简化版处理. 我所采取的简化版高斯模糊就是对区域大小
的区域进行处理
利用正态分布计算所得到的
的权重矩阵如下:
![](https://img-blog.csdnimg.cn/img_convert/268770f2b745862e4dfa44ae1d7a1400.png)
对对应位置的权重相乘即可
三、实验心得:
Lab 2主要考察了对树状数据结构的掌握程度, 掌握树状数据结构的特点 -- 利用递归进行建树处理即可
其次, 通过此次实验学习到了有关于.ppm文件的格式、两种图像模糊处理的方法 -- 均值模糊和高斯模糊、四叉树\八叉树的一些相关应用 (这段时间有点忙, 立个flag在这里, 过段时间来补)
四、项目需要改进的地方:
我觉得主要是高斯模糊那块儿, 还未能真正的做好. 仅仅考虑了高斯模糊的简化版本.
五、项目源码:
见我的github网址: GitHub - xinchen-boom/Algorithm-project-2-Four-Boco-tree-image-blurred: 算法与数据结构项目2: 四叉树图像模糊
六、写在后面:
关于.ppm格式的文件以及高斯模糊的一些相关介绍等过段时间来补, 敬请期待. 😄