Notes:源自于老板最近想接的横向项目,记录一下从调研到跑路的历程:D。
(单纯做图像处理的一般都是Matlab代码,Python实现的代码可太少了:(…)

一、遥感图像变化检测

1、任务目标

  • 利用多时相的遥感数据,采用多种图像处理和模式识别方法提取变化信息,并定量分析和确定地表变化的特征与过程。它涉及变化的类型、分布状况与变化量,即需要确定变化前、后的地面类型、界线、及变化趋势,进而分析这些动态变化的特点与原因。
    (1)判断是否发生了变化;
    (2)确定发生变化的区域;
    (3)鉴别变化的性质;
    (4)评估变化的时间和空间分布模式。
    变化检测
    猜测前两点的变化检测就是“他们”要达到的基本目标了,前两点也是变化检测研究中需要首先解决的问题,狭义上的变化检测概念即是由这两方面构成。

2、影响因素(难点)

  • 遥感系统因素的影响(时间、空间、光谱、辐射分辨率)
  • 环境因素的影响(大气、土壤湿度状况、物候特征)
  • 成像设备?(猜测本次任务存在这个问题)

二、数据集整理

三、已有方法

1、传统方法

(1)比较后分类变化检测算法

  • 基于简单代数运算的变化检测方法
    归一化图像差值法
    (已实现)图像灰度差值法(图像的灰度信息反映了地物的波谱反射特性)
    图像纹理特征差值法
    图像回归法
    图像植被指数差分法
    图像比值法
    变化向量分析法
  • 基于图像变换的变化检测方法
    (已实现)主成分分析法PCA
    独立成分分析法ICA
    正交变换
    缨帽变换(K-T变换)
    典型相关分析(CCA)
    (已实现)多元变化检测(multivariate alteration detection,MAD)
    Gramm-Schmidt变换
    Chi-square变换
    穗帽变换(Tasseled Cap Transformation)
    HSI变换
  • 基于图像空间特征的变化检测方法
    基于统计特征的变化检测算法
    基于纹理特征的变化检测算法
    基于空间结构特征的变化检测算法

(2)分类后比较变化检测算法

(3)基于对象变化检测算法

(4)基于统计模型变化检测方法

2、部分还没看的论文(传统方法)

(1) 2019.Bobholamovic/ChangeDetectionToolbox
(2) 2019.M J Canty. Image Analysis, Classification and Change Detection in Remote Sensing(Fourth Revised Edition)
(3) 2017.M J Canty. Change Detection with Google Earth Engine Imagery
(4) 2014.M J Canty. Image Analysis, Classification and Change Detection in Remote Sensing(Third Revised Edition)
(5) Zhu Zhe.Algorithm developed for Continuous Change Detection and Classification (CCDC) of land cover using all available Landsat data
(6) Implementation of “ 2009.Celik T. Unsupervised change detection in satellite images using principal component analysis and k-means clustering “.(Matlab, Python)
(7) 2007.Allan Aasbjerg Nielsen.IR-MAD(The Regularized Iteratively Reweighted Multivariate Alteration Detection)

四、后处理

  • 经过图像处理会出现较多的小连通区域或孔洞,只能通过后处理来解决。

1、填充孔洞

1
2
3
4
5
# 膨胀再腐蚀回去
img = img.astype('uint8')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
img = cv2.dilate(img, kernel)
img = cv2.erode(img, kernel)

2、小连通区域的去除

1
2
3
4
5
6
7
# 阈值法,连通区域面积小于设定阈值时填充为背景
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for contour in contours:
area = cv2.contourArea(contour)
if area < threshold:
cv2.drawContours(img, [contour], -1, (0,0,0), thickness=-1) # 填充为背景(0,0,0)
continue