五、数据结构设计:(C++描述)
用bfs算法进行的话,必然需要队列,但是种子们不能用队列去存,某个种子进行生长的时候可以用队列记录每一个生长状态
此法采用8领域进行生长
用队列存储当前种子生长过程中的状态点,进行bfs扩展,确定该种子生长所形成的区域
用set容器存储各个种子,保证了种子点唯一性,即优点2,同时,set容器还会根据位置自动排序,所以导致了缺点2,其次,set容器的存取操作的时间复杂度均为O(n log n)
Bfs状态采用只包含x、y坐标的一个结构体
六、效果与讨论
采用C++描述的首次左上区域生长算法针对2012*1881的灰度卫星图像矩阵数据处理时间为:78.9s
阈值为20
图1
首先蓝色圈所代表的部分,如果是水域的深浅,那么这一块还是被划分的很清楚的,大致分了5部分
再看下阈值为25的图
图2
如我们所预期的那样,图1中蓝色圈的水深划分等级更少了
其次,我们看图1的红色圈代表的水体,内部中间划分出来的区域更小了,或者说水体的边缘区域扩张了。
再如,黑色圈代表的水域,中间的黑色圈有一块东西,它的区域更小了,不利于捕捉细微的水内状况
如果图1的黑色内的小黑圈部分看不太清楚,那么可以看一下下面这个,都是一样的
XnView打开效果
图3
如果把黄色部分看做是竖着的地质锤,那么图2显然少了锤头~
还有水边一片房子聚集地,也被基本划分为一种色调
图4
而针对下图以及图4以及原图上方一片森林山脉,将各种处理方法进行叠加,效果可能会更好,方案如下:
有很多星星点点的噪声,可以选择先去噪声,但是,效果也不是很好
如果要将其纳入到统一的大片区域中,还是选择先做一个平滑处理,将其尖锐的边缘过渡更加平滑些,再进行区域生长,加以阈值调整,星点可能会减少,可能还存在一些,但是不会那么显眼,和周围环境的色差不会那么大了
图5
七、代码
matlab 代码