python bayes贝叶斯图像融合 原理及实验

贝叶斯在概率学中,相对于古典古典概率,引入了主观因素【对于未知的参数视为随机变量,而不是一个固定值,比如抛硬币】

参考知乎大神举得栗子:

举个例子:生病的几率
一种癌症,得了这个癌症的人被检测出为阳性的几率为90%,未得这种癌症的人被检测出阴性的几率为90%,而人群中得这种癌症的几率为1%,一个人被检测出阳性,问这个人得癌症的几率为多少?
https://www.zhihu.com/question/21134457/answer/169523403

Bayes图像融合

原理观测模型:
图像中空间位置为i的像素值排列成一位列向量,像素数目为N:

    (高)全色波段 

x = [x1,x2,…,xi,…,xN]T

    (低)多光谱波段    

y = [y1,y2,…,yi,…,yM]T

    **假定存在高分辨率多光谱影像z:**

z = [z1,z2,…,zi,…,zM]T

一般地,低分辨的多光谱影像可以认为是有高分辨率的多光谱影像(待求)通过低通滤波和降采样得到,观测模型为:

y=Hz+u

H矩阵表示低通滤波和降采样的过程;(贝叶斯算法求解)
u是随机噪声,它的均值是零,协方差矩阵是Cu,且与z是不相关

另外,假设高分辨率的全色波段图像和高分辨率的多光谱图像之间,存在如下观测模型

X=GTz+v

G矩阵是一个稀疏矩阵,它的每一列是全色图像各个像素位置上的光谱响应函数,反映全色图像的频谱和多光谱图像的频谱之间的关系

观测模型联立成立Bayes线性模型:

应用LMMSE估计量得到高分辨率的多光谱图像估计(令n=[uT,vT]T])

**高分辨率多光谱图像估算量两类重构方法:
1.通过对低分辨率多光谱图像的残差[y-E(y)]进行逆向映射
2.将全色图像的空间信息[x-E(x)]扩展到多光谱图像的各个波段**

参考文献:
葛志荣, 王斌, 张立明. 基于Bayes线性估计的遥感图像融合[J]. 中国科学:技术科学, 2007, 37(4):501-513.

贝叶斯代码测试:
使用sklearn类库中的GaussianNB,高斯朴素贝叶斯方法
原图:
python bayes贝叶斯图像融合 原理及实验_第1张图片

import pandas as pd
import  numpy as np
import time
from sklearn import naive_bayes
from sklearn.naive_bayes import GaussianNB
import  gdal


tifW = gdal.Open(r"F:\Wujd\0411贝叶斯融合\data\S1_X.tif")
tifM = gdal.Open(r"F:\Wujd\0411贝叶斯融合\data\S1_y.tif")


dataM = tifM.ReadAsArray(0,0,3,3)
dataW = tifW.ReadAsArray(0,0,3,3)
# X = np.array([[1],[2],[3],[4],[5],[6]])
# y =  Y = np.array([1, 1, 1, 2, 2, 2])
X =np.array(dataM[0])       #训练向量(二维数组shape (n_samples, n_features))
y = np.array(np.random.randint(1,255,3))   #测试值(一维数组shape (n_samples)) 须是整型


clf = GaussianNB()      #创建高斯分类器
clf.fit(X,y)            #使用fit替代train训练集,把GaussianNB赋值给clf



#它会学习各种模式,然后就形成了我们刚刚创建的分类器(clf)
#我们在分类器上调用fit函数,接下来将两个参数传递给fit函数,一个是特征x一个是标签y
#在监督分类中这个过程都是如此,先调用fit函数,然后依次获得特征和标签

#最后我们让已经完成了训练的分类器进行一些预测,我们为它提供一个新点[二维数组shape (n_samples, n_features)]
#我们系那个知道的是,这个特定点的标签是什么?它属于什么类?
print("训练向量",dataW)
print("测试向量",dataW)

print("预测一维数组",clf.predict([[1,1,2 ],[1,2,2],[1,2,3]]))

结果:
C:\ProgramData\Anaconda3\python.exe F:/Wujd/0319Test/bayes/bayes_NB.py
训练向量 [[[  0   0   0]
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\naive_bayes.py:432: RuntimeWarning: divide by zero encountered in log
  [  0   0   0]
  n_ij = - 0.5 * np.sum(np.log(2. * np.pi * self.sigma_[i, :]))
  [  0 237 237]]

 [[  0   0   0]
  [  0   0   0]
  [  0  28  28]]

 [[  0   0   0]
  [  0   0   0]
  [  0  36  36]]
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\naive_bayes.py:434: RuntimeWarning: divide by zero encountered in true_divide

  (self.sigma_[i, :]), 1)
 [[255 255 255]
  [255 255 255]
  [255 255 255]]]
测试向量 [[[  0   0   0]
  [  0   0   0]
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\naive_bayes.py:434: RuntimeWarning: invalid value encountered in subtract
  [  0 237 237]]
  (self.sigma_[i, :]), 1)

 [[  0   0   0]
  [  0   0   0]
  [  0  28  28]]

 [[  0   0   0]
  [  0   0   0]
  [  0  36  36]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]]]
预测一维数组 [140 140 140]

预测数组每次运行的结果都不一致,且训练向量与测试向量在维度要相同

你可能感兴趣的:(python)