课程名称现代数字图像处理与分析教师姓名姓名学号专业所在院系计算机学院类别: A.博士B.硕士 C.进修生日期: 2019年5月29 日评语注:1、无评阅人签名成绩无效;2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
计算遥感图中长江的流域面积一、前言数字图像处理是一种通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。
数字图像树立技术目前已经在各个领域上都有了比较广泛的应用。
下文主要讲了的是通过图像分割算法将遥感图中长江的流域面积分割出来,再计算其流域面积。
分辨率为30m的遥感图如图1所示:图1 遥感图二、常用的图像分割算法图像分割方法的研究一直受到很多学者的关注,四十多年里,图像分割的研究一直受到人们高度的重视。
迄今为止。
研究者们已经提出了上千种各种类型的分割算法,而且近年来每年都有上百篇相关研究成果发表。
但是,现有的方法多是为特定应用设计的,有很大的针对性和局限性,对图像分割的研究还缺乏一个统一的理论体系。
Fu和Mui从细胞学图像处理的角度将图像分割技术分为三大类:特征阀值或聚类、边缘检测和区域提取。
一个更加细致的分类里,Haraliek and Shapiro将所有算法分为6类:测度空间导向的空间聚类、单一连接区域生长策略、混合连接区域生长策略、中心连接区域生长策略、空间聚类策略和分裂合并策略。
依据算法所使用的技术或针对的图像,Pal and Pal也把图像分割算法分成了6类:阀值分割、像素分割、深度图像分割、彩色图像分割、边缘检测和基于模糊集的方法。
但是,该分类方法中,各个类别的内容是有重叠的。
为了涵盖不断涌现的新方法,有的研究者将图像分割算法分类以下类:并行边界分割技术、串行边界分割技术、并行区域分割技术、串行区域分割技术、结合特定理论工具的分割技术和特殊图像分割技术。
而在较近的一篇综述中,更有学者将图像分割简单的分成基于数据驱动的分割和基于模型驱动的分割两类。
下面,我们将图像分割算法分为以下5类:基于阀值化的分割、基于边缘的分割、基于区域的分割、基于聚类的分割、基于形态学及其他分割方法。
由于该课程报告采用基于阈值化的分割算法分割图1所示的遥感图,下面只详细讲述基于阈值化的分割算法。
阈值化分割是最常见的直接检测区域的分割方法,它就是简单地用一个或几个阈值将图像的灰度直方图分成几个类,如果只需选取一个阈值称为单阈值分割,它将图像分为目标和背景两大类;如果选取多个阈值分割称为多阀值方法,图像将被分割为多个目标区域和背景。
阈值化分割的结果依赖于阈值的选取,确定阈值是阈值化分割方法的关键,阈值化分割实质上就是按照某个准则求出最佳阈值的过程。
常用的全局阈值选取方法有利用图像灰度直方图的峰谷法、最小误差法、最大类间方差法、最大熵自动阈值法以及其他一些方法。
阈值化分割方法计算简单,运算效率较高,速度快。
全局阀值对于灰度相差较大的不同目标和背景能进行有效的分割,当图像的灰度差异不明显或不同目标的灰度值范围有重叠时,应采用局部阀值或动态阈值分割法。
但这种方法只考虑像素本身的灰度值,一般不考虑空间特征,因而对噪声很敏感。
在实际应用中,阈值法通常与其他方法结合使用。
三、实际应用在实际应用中,采用python语言编程,需要安装opencv的包。
首先下载Anaconda软件,Anaconda是一个开源的包、环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换。
安装好后,点击Environments,选择anaconda3.0.5(3.0.5为版本号),将搜索栏中缺省的搜索条件installed更改为all,之后搜索opencv下载即可,具体如图2所示:图2 安装python以及opencv之后,使用pycharm集成开发环境,依赖项选择anaconda3.0.5下的python.exe。
1、导入CV2和numpy,读取TIF图像,代码如图3所示:图3 读取遥感图像2、获取图中水域的RGB值,对应三个数值,可以利用photoshop软件提取,本例中获取的水域的RGB值分别为10,10,10。
经过多次实验,提取在该值上下浮动分别为8和2区间的值分割效果最佳,作为影像二值化的依据。
(补充:影像必须先进行灰度化,然后才进行二值化处理。
)对于在水域RGB区间内的影像部分赋值为白色(255),其余部分赋值为黑色(0),代码如图4所示:图4 图像二值化其结果命名为掩膜数据,结果如图5所示:图5 掩膜数据将TIF图像放大,可看到图中长江流域被横过的大桥分割开来,被分为6块,具体如图6所示:图6长江流域被二值化情况3、OpenCV提供了cv2.findContours()函数提取二值化图像的轮廓。
对上面生成图片上执行这个函数就可以返回该图片的区域轮廓。
由于执行该函数时会直接修改图像,因此我们复制一份图像之传给cv2.findContours();同时,OpenCV提供了cv2.drawContour()函数绘可以把轮廓叠加到另一张图片上。
具体如图7所示:图7 提取轮廓利用findCountours()函数,得到169182个轮廓,结果如图8所示:图8 轮廓图将图像放大,发现长江如掩膜数据中二值化效果一致,具体如图9所示:图9 分割情况4、在获取的轮廓结果图中我们可以看到,存在众多的细小板块,其中contours.sort(key=len,reverse=True)可以对细小斑块的面积进行排序,图中长江被分割为6个部分,经过多次实验,6个部分的排序顺序小标分别为0、4、7、27、58和81,具体如图10所示:图10分割模块将六个分割轮廓拼接在一起得到目标分割图,即遥感图中长江的流域面积分割图,如图11所示:图11 目标分割图虽然已经将长江流域分割出来了,但放大图片之后会发现有些地方会分割不开,如图12所示:图12 缺陷5、利用cv2.contourArea()函数,分别计算六块分割图的像素点个数,已知遥感图的分辨率为30m,故一个像素点对应的实际面积为30*30=900m2,具体代码如图13所示:图13 计算长江流域面积计算得出六块分割图的总像素点个数为606807个,流域面积为546.1263平方公里。
计算结果如图14所示:图14 计算结果6、完整代码:import cv2import numpyimage=cv2.imread("p4.tif")RGB = numpy.array([10,10,10])upper = RGB+8lower = RGB - 2mask = cv2.inRange(image,lower,upper)cv2.imshow("Mask",mask)cv2.imwrite('mask.tif',mask)(_,contours,hicrarchy) = cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)print("number of contours:%d" %(len(contours)))allWaterAreaImage = image.copy()cv2.drawContours(allWaterAreaImage,contours,-1,(0,0,255),2)cv2.imshow("Image of All waterArea",allWaterAreaImage)cv2.imwrite('allWaterArea.tif',allWaterAreaImage)theLargestWaterArea = image.copy()contours.sort(key=len,reverse=True)cv2.drawContours(theLargestWaterArea,[contours[0]],-1,(0,0,255),2)cv2.drawContours(theLargestWaterArea,[contours[4]],-1,(0,0,255),2)cv2.drawContours(theLargestWaterArea,[contours[7]],-1,(0,0,255),2)cv2.drawContours(theLargestWaterArea,[contours[27]],-1,(0,0,255),2)cv2.drawContours(theLargestWaterArea,[contours[58]],-1,(0,0,255),2)cv2.drawContours(theLargestWaterArea,[contours[81]],-1,(0,0,255),2)cv2.imshow("Image of the Largest waterArea",theLargestWaterArea)cv2.imwrite('lWaterArea.tif',theLargestWaterArea)num=cv2.contourArea(contours[0])+cv2.contourArea(contours[4])+cv2.contour Area(contours[7])+cv2.contourArea(contours[27])+cv2.contourArea(contours[58])+c v2.contourArea(contours[81])print(num)print((num*900)/1000000)cv2.waitKey()四、总结这次实验报告,只是对opencv中算法的应用,并没有针对算法做相应的优化以及改进。
在实际应用过程也会发现算法不能将长江中的沙洲分割开,经过多次实验以及算法改进,并没有将算法中的缺陷有效解决。
本人水平有限,只能放弃对算法的修改,望后续能够解决。
11。