DTCM算法的Python实现
之前的代码链接误删,现在已经补上Python代码和Matlab版代码。
动态阈值云检测(Dynamic Threshold Cloud-Masking, DTCM)算法是一种利用遥感图像直方图变化情况动态获取云地分离阈值的云检测算法。其提出者Alan Di. Vittorio和William J. Emery(2002)认为在只含有单一地物的有云图像直方图中,地物峰向云一侧的直方图曲线二阶差分零点,即曲线变化率最大处,适合作为云地分离的阈 值。
1 算法基本流程
1)创建遥感图像灰度直方图。
2)用较大的间距对直方图进行粗平滑以屏蔽一部分伪地物峰,寻找从零点开始第一个峰作为地物峰(若是热红外波段,则是最后一个峰)的大概位置。
3)用较小的间距对直方图进行细平滑,在上一步确定的位置附近寻找最大峰值作为地物峰所在。
4)对平滑后的直方图进行二次差分,在地物峰值点附近寻找二次差分的峰值点,即选取原直方图的斜率最大变率处灰度为阈值。对于反射波段,应在大于灰度频
率峰值点的区间汇中寻找;对于热红外波段,应在小于地物峰值点的区间中寻找。对于为了防止阈值过于接近峰值点,应从以峰值点为中心两倍间距外的区域中进行
搜索。
5)如果无法通过上述方法确定阈值,则使用二分法求出阈值。
6)像元值小于阈值的像元为地物像元,大于阈值的像元为云像元。对于热红外波段,反之。
虽然Alan是针对AVHRR图像的云检测问题提出DTCM算法,但DTCM算法本质上并不依赖于特定的传感器特征、特定的光谱特征或其他外部资料。 DTCM算法只根据图像的局部灰度直方图特征确定该区域的阈值,因此适用于任意通道的陆面影像,具有良好的兼容性和可移植性。其中,我国风云二号卫星和风 云三号卫星的业务云检测产品均使用基于DTCM算法的方法。
2 Python实现
由于最近在学习Python,便将之前搞论文时的MATLAB版DTCM算法改为Python作为练习。具体的代码内容不一一列举,有兴趣的朋友可以查看源代码。其使用如下:
import PyDTCM, gdal import matplotlib.pyplot as plt # 使用GDAL读取遥感图像 testImage='L1 0245 B1 Clipped.tif' dataA=gdal.Open(testImage) band=dataA.GetRasterBand(1).ReadAsArray() # 利用DTCM法进行云检测 mask = PyDTCM.dtcm(band, 15, 30, 'REF') # 显示检测结果 maskplot = plt.imshow(mask) plt.show()
PyDTCM中定义dtcm(imagedata, sinterval, binterval, imagetype)作为检测函数。其中imagedata是单波段的数据矩阵,其类型是numpy.ndarray。sinterval是平滑小间 距,binterval是平滑大间距。imagetype指示需要处理图像类型,包括 'REF' 反射波段图像和 ‘INF’ 热红外波段图像。返回的结果中,1代表云像元,0代表晴空像元。该模块需要numpy支持。
Python源代码下载:http://pan.baidu.com/s/1ouIfx
Matlab源代码下载:http://pan.baidu.com/s/1EJhkH
其中Matlab_Classic为主程序,如果要使用该段代码,请进行修改以便匹配你的数据源!
3 运行结果
使用FY-3A的VIRR可见光波段图像进行云检测,其结果如下:
原始图像 -
检测结果 - 
4 扩展阅读
[1] Di Vittorio A V, Emery W J. An automated, dynamic threshold cloud-masking algorithm for daytime AVHRR images over land[J]. Geoscience and Remote Sensing, IEEE Transactions on, 2002, 40(8): 1682-1694.
[2] 刘健. FY-2 云检测中动态阈值提取技术改进方法研究[J]. 红外与毫米波学报, 2010, 29(004): 288-292.
[3] 刘希, 许健民, 杜秉玉. 用双通道动态阈值对 GMS-5 图像进行自动云检测[J]. 应用气象学报, 2005, 16(4): 434-444.
[4] 杨军, 董超华. 新一代风云极轨气象卫星业务产品及应用[J], 科学出版社, 2011.

浙公网安备 33010602011771号