遥感影像变化检测算法实现

基于遥感图像变换检测算法实现
**主要用到比值法 插值法 cva算法 rcva 算法(理解不透彻) pca 算法评价算法`

代码实现

import cv2
import matplotlib.pyplot as plt
import numpy as np
import math

img1=cv2.imread('C:\\Users\dell\Desktop\RXX-2020-CVA\RXX-2020-CVA\Testing dataset\TianJing-SPOT/09BMP.bmp')
img2=cv2.imread('C:\\Users\dell\Desktop\RXX-2020-CVA\RXX-2020-CVA\Testing dataset\TianJing-SPOT/10BMP.bmp')

def Find_Threshold(delta):#OTSU寻找阈值
    # 求灰度方差最大的那个数
    val=np.zeros([256])
    for th in range(256):
        loc1=delta>th
        loc2=delta<=th
        '''delta[loc1]=255
        delta[loc2]=0'''
        if delta[loc1].size==0:
            mu1=0
            omega1=0
        else:
            mu1=np.mean(delta[loc1])
            omega1=delta[loc1].size/delta.size

        if delta[loc2].size==0:
            mu2=0
            omega2=0
        else:
            mu2=np.mean(delta[loc2])
            omega2=delta[loc2].size/delta.size
        val[th]=omega1*omega2*np.power((mu1-mu2),2)

    #print("val=",val.shape)
    plt.figure()
    loc=np.where(val==np.max(val))
    #x=np.arange(0,256,1)
    #x=x.reshape([1,256])
    plt.plot(val)
    plt.ylabel("Var")
    plt.xlabel("Threshold")
    plt.grid("on")

    print("\nThe best OTSU Threshold: ",loc[0])
    return loc[0]

def CD_diff(img1,img2):#影像差值法

    delta=np.subtract(img2,img1)
    #delta=np.abs(delta)
    #delta.min()
    sh=delta.shape
    delta+=np.abs(delta.min())
    th=Find_Threshold(delta)
    delta = cv2.cvtColor(delta, cv2.COLOR_BGR2GRAY)
    #print(delta.min())
    if np.size(th)>1:
        th=th[0]
    for i1 in range(sh[0]):
        for i2 in range(sh[1]):
            if delta[i1][i2]>=th:
                delta[i1][i2]=0
            else:
                delta[i1][i2]=255
    return delta


def divede(img1,img2):
    delta=cv2.divide(img2,img1)
    #delta=np.abs(delta)
    #delta.min()
    (mean1,stddv1)=cv2.meanStdDev(delta)
    gray2 = cv2.cvtColor(delta, cv2.COLOR_BGR2GRAY)
    
    ret2,thread2=cv2.threshold(gray2,mean1[0]+1,255,cv2.THRESH_BINARY)
    return thread2


def cva(img1,img2):
    b,g,r=cv2.split(img1)
    b1,g1,r1=cv2.split(img2)
    sh=img1.shape

    (row,col)=b1.shape
    d_1=np.subtract(b,b1)
    d_1+=np.abs(d_1.min())
    d_2=np.subtract(g,g1)
    d_2+=np.abs(d_2.min())
    d_3=np.subtract(r,r1)
    d_3+=np.abs(d_3.min())

    d_1=cv2.pow(d_1,2)
    d_2=cv2.pow(d_2,2)
    d_3=cv2.pow(d_3,2)
    delta=cv2.add(d_1,d_2,d_3)
    for i in range(sh[0]):
        for j in range(sh[1]):
            delta[i,j]=math.sqrt(delta[i,j])+10
    th=Find_Threshold(delta)
    delta = cv2.cvtColor(delta, cv2.COLOR_BGR2GRAY)
    #print(delta.min())
    if np.size(th)>1:
        th=th[0]
    for i1 in range(sh[0]):
        for i2 in range(sh[1]):
            if delta[i1][i2]>=th:
                delta[i1][i2]=0
            else:
                delta[i1][i2]=255
    return delta


# rcva 方法
def rcva(img1,img2):
# 代码实现2w+1 w采用的是1 
def rcva(img1,img2): 
    b,g,red=cv2.split(img1)
    b1,g1,red1=cv2.split(img2)

    (row,cloumn)=b.shape
    #上下左右 左上 右上 左下 右下的坐标变化
    x=[-1,1,0,0,-1,-1,1,1]
    y=[0,0,-1,1,-1,1,-1,1]
    
    #保存变化后的差异图
    img_a=np.zeros((row,cloumn))
    img_b=np.zeros((row,cloumn))
    print("正在计算")
    for i in range(row):
        for j in range(cloumn):
            if i!=0 and j!=0 and i!=row and j!=cloumn:
                r=i
                c=j
                res1=1000000.0
                res2=1000000.0
                res3=1000000.0
                for k in range(8):
                    if(0<r and r<row and c>0 and c<cloumn):
                        kk1=(math.pow(abs(int(b[i,j])-int(b1[r,c])),2))
                        if(kk1<res1):
                            res1=kk1
                        kk2=(math.pow(abs(int(g[i,j])-int(g1[r,c])),2))
                        if(kk2<res2):
                            res2=kk2
                        kk3=(math.pow(abs(int(red[i,j])-int(red1[r,c])),2))
                        if(kk3<res3):
                            res3=kk3
                    r=i
                    c=j
                    r+=x[k]
                    c+=y[k]
                img_a[i][j]=math.sqrt(res1+res2+res3)
                
        # 考虑四个边角 和四个边界
            else:
                img_a[i,j]=abs(int(b[i,j])-int(b1[i,j]))
    
    print("正在计算中请稍等")
    
    for i in range(row):
        for j in range(cloumn):
            if i!=0 and j!=0 and i!=row and j!=cloumn:
                r=i
                c=j
                res1=1000000.0
                res2=1000000.0
                res3=1000000.0
                for k in range(8):
                    if(0<r and r<row and c>0 and c<cloumn):
                        kk1=(math.pow(abs(int(b[i,j])-int(b1[r,c])),2))
                        if(kk1<res1):
                            res1=kk1
                        kk2=(math.pow(abs(int(g[i,j])-int(g1[r,c])),2))
                        if(kk2<res2):
                            res2=kk2
                        kk3=(math.pow(abs(int(red[i,j])-int(red1[r,c])),2))
                        if(kk3<res3):
                            res3=kk3
                    r=i
                    c=j
                    r+=x[k]
                    c+=y[k]
                img_b[i][j]=math.sqrt(res1+res2+res3)
        # 考虑四个边角 和四个边界
            else:
                img_b[i,j]=abs(int(b1[i,j])-int(b[i,j]))

    img_b_change=np.zeros((row,cloumn))
    for i in range(row):
        for j in range(cloumn):
            if img_a[i,j]>img_b[i,j]:
                img_b_change[i,j]=img_b[i,j]
            else:
                img_b_change[i,j]=img_a[i,j]

    print("计算完成正在二值化")
    th=Find_Threshold(img_b_change)
    
    for i1 in range(row):
        for i2 in range(cloumn):
            if img_b_change[i1][i2]<=th:
                img_b_change[i1][i2]=0
            else:
                img_b_change[i1][i2]=255
    cv2.imshow('diff3',img_b_change)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 主成向量分析法

# 这个是二维
def Img_PCA(delta):
    U,S,V=np.linalg.svd(delta)
    SS=np.zeros(U.shape)
    print(SS.shape)
    
    for i in range(S.shape[0]):
        SS[i][i]=S[i]

    def Pick_k(S):
        sval=np.sum(S)
        for i in range(S.shape[0]):
            if np.sum(S[:i])>=0.6*sval:
                break
        return i+1

    k=Pick_k(S)
    print("\nNumber of vectors to reserve: k= ",k)
    Uk=U[:,0:k]
    Sk=SS[0:k,0:k]
    Vk=V[0:k,:]
    im=np.dot(np.dot(Uk,Sk),Vk)
   # im=np.dot(im,delta)
    return im


# 差值pca 法
# 先做插值再做PCA
i=Img_PCA(CD_diff(img1,img2))

# PCA 插值法

#ii=CD_diff(Img_PCA(img1[0]),Img_PCA(img2[0]))

cv2.imshow('diff',i)
cv2.waitKey(0)
cv2.destroyAllWindows()
```python
在这里插入代码片

评价算法

def evevalue_it(img1,img2):
    # img1 the true picture
    #img2 the detected pictrue
    # 图像检测评价
    #两个算法通过对比黑色表示变化部分
    #不一定黑色就是变化部分

    x00=0
    x10=0
    x01=0
    x11=0
    (row,cloumn)=img1.shape
    for i in range(row):
        for j in range(cloumn):
            if img1[i][j]==0 and img2[i][j]==0:
                x00+=1
            if img1[i][j]==255 and img2[i][j]==255:
                x11+=1
            if img1[i][j]==255 and img2[i][j]==0:
                x10+=1
            if img1[i][j]==0 and img2[i][j]==255:
                x01+=1
    
    print(x00,x11,x10,x01)
    TRC=x00+x10
    print(TRC)
    TRU=x01+x11
    print(TRU)
    TDC=x00+x01
    print(TDC)
    TDU=x10+x11
    T=TRC+TDC
    #总错误率
    
    total_erro=(x01+x10)/T
    #总误错率
    fake_erro=x01/TRU
    #误漏率
    dn_find_erro=x10/TRC
    #整体精度
    total_accucy=(x00+x11)/T
    print("总错误率为%f" %total_erro+"总误错率为%f" %fake_erro+"漏错率为%f" %dn_find_erro,"整体精度为%f" %total_accucy,sep=";")


部分算法效果不是很好,我在改进代码中。望帮助到你
  • 10
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 遥感图像变化检测是一种常见的遥感应用,能够自动化地检测出地表覆盖类型和空间位置的变化。MATLAB在遥感图像变化检测方面提供了多种算法和工具,其中最常用的是基于差异图像的变化检测。 基于差异图像的变化检测算法主要分为基于像素的变化检测和基于物体的变化检测两种。基于像素的变化检测主要是通过将两幅遥感图像进行像素级差异分析,利用像素灰度值或反射率差异检测出变化的区域。基于物体的变化检测则是在像素级的基础上,通过目标检测、分割和特征提取等步骤,从物体级别分析图像差异。 MATLAB中的遥感图像变化检测算法包括基于非监督和监督学习的方法,其中非监督方法主要是基于差异图像的像素级聚类分析,例如基于Kmeans聚类算法和基于NMF的聚类算法。监督方法则是利用已知变化区域进行样本训练,并通过分类器进行像素分类,例如基于支持向量机(SVM)算法和基于随机森林(RF)算法的监督学习。 除了差异图像法之外,MATLAB还支持其他遥感图像变化检测算法,例如基于时序图像的差法、数据融合法和基于全局变化指标的变化检测。同时,MATLAB还提供了多种遥感图像预处理、分割和特征提取工具,以加强遥感图像变化检测的效果。 总之,MATLAB提供了丰富的遥感图像变化检测算法和工具,可根据实际需求进行选择和应用,从而实现高效、准确的遥感应用任务。 ### 回答2: MATLAB遥感图像变化检测算法是针对遥感图像的一种算法,其目的是检测遥感图像中的变化情况。该算法通常基于两幅同一区域的遥感图像,包括参考图像和目标图像,然后通过比较这两幅图像的不同之处来确定变化情况。 该算法通常基于像素级别进行变化检测,其中包括一系列的预处理步骤,例如图像配准,噪声消除和分割等。在图像配准阶段,参考图像和目标图像需要进行几何校正,以确保它们的像素位置是一致的。然后,通过应用图像分割算法,将图像分割成离散对象,并根据对象的几何特征进行分类。 接下来,在参考图像和目标图像之间执行像素级别的变化检测。通常,采用基于灰度值或颜色信息的算法,如阈值方法、比率指数方法和基于像素间相似性的方法。 最后,根据检测到的变化信息,可以进行后续的分析,例如建立变化检测图和时序变化图,以更好地了解不同时间点的区域变化情况。 总之,MATLAB遥感图像变化检测算法是一种基于像素级别的遥感图像分析方法,通常应用于图像变化检测和监测,具有广泛的应用前景。 ### 回答3: matlab遥感图像变化检测算法主要用于对不同时间拍摄的遥感图像进行比较,并检测出两幅图像之间的变化。这种算法具有很多应用,例如地质探测、城市更新监测、灾害评估等领域。 该算法实现步骤包括图像预处理、特征提取和变化检测。首先,需要对两幅输入图像进行预处理,如均衡化、去噪、平滑等操作。接着,利用图像分割和分类技术,提取出两幅图像中的目标区域,并对其进行特征提取,如色调、纹理、形状、大小等特征。 最后,运用像素级变化检测算法,比对两幅图像中目标区域的像素值和特征,判断其是否有变化。常用的变化检测算法包括比较阈值、差异度、指数滤波、模板匹配、基于PCA等。 综上所述,matlab遥感图像变化检测算法是一种非常有用的技术,在实际应用中有很多的优势。例如,可以高效地对大规模的遥感图像进行处理,提高遥感数据的利用率和分析效率等。未来,随着遥感技术和计算机科学的发展,该算法将会得到更广泛的应用和推广。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值