多光谱数据的贝叶斯分类

1.原理介绍

1.1最佳统计分类器

来自类 ωj 的特定模式概率表示为 p(ωj/x)。如果模式分类器判断 x 来自类 ωj,而实际它来自类 ωi,
那么分类器就会导致一次损失,表示为 Lij。由于模式 x 可能来自 W 中的任何一个类,故将模式 x 判
决为 ωj 的平均损失为:
在这里插入图片描述
根据贝叶斯公式, p(A/B) = [P(A)P(B/A)]/P(B),所以上式可以写为:
在这里插入图片描述
经过讨论,我们知道 0-1 损失函数的贝叶斯分类器的决策函数的计算:
在这里插入图片描述

1.2高斯模式类的贝叶斯分类器

高斯分类器由样本均值向量和协方差矩阵决定,均值向量和协方差的估计如下:
在这里插入图片描述

在这里插入图片描述
根据前述的贝叶斯分类器决策函数,高斯模式下的贝叶斯分类器决策函数为:
在这里插入图片描述
如果所有的协方差矩阵都相等,则:
在这里插入图片描述
这是一个线性决策函数(超平面),其中 j = 1, 2, . . . , W。进一步如果 C = I,这里 I 为单位矩阵,且
P(ωj) = 1/W, j = 1, 2, . . . , W,则有:
在这里插入图片描述

2.多光谱图像贝叶斯分类

在这里插入图片描述
地面上的每个点都可以形如 x = (x1, x2, x3, x4)T 的一个四维模式向量表示,其中 x1 为蓝光图像,
x2 为绿光图像等等。如实验原理所述,高斯模式分类器要求估计每个类的均值向量和协方差矩阵。
根据前述高斯模式类贝叶斯分类器原理,完成该实验分为如下步骤:
在这里插入图片描述

2.1分类结果

在这里插入图片描述

2.2MATLAB代码

主函数:

clc;
clear;
close all;
%读入蓝光、绿光、红光与红外波段图像
imga=imread(['blue', '.tif']);
[M,N]=size(imga);
imgb=imread(['green', '.tif']);
imgc=imread(['red', '.tif']);
imgd=imread(['outside', '.tif']);
imge=imread(['model', '.tif']);
%样本模板图像
water=imread(['water', '.tif']);
city=imread(['city', '.tif']);
tree=imread(['tree', '.tif']);
%样本数
waterN=sum(sum(water));%967
cityN=sum(sum(city));%1865
treeN=sum(sum(tree));%965
%%%%%%%%训练过程 计算每个类均值方差
[waterm,waterC]=junzhifangc(M,N,imga,imgb,imgc,imgd,water,waterN);
[citym,cityC]=junzhifangc(M,N,imga,imgb,imgc,imgd,city,cityN);
[treem,treeC]=junzhifangc(M,N,imga,imgb,imgc,imgd,tree,treeN);

%%%%%%%%%分类为水体%%%%%%%%%
waterdiv=zeros(M,N);
for i=1:M
    for j=1:N
        x=[imga(i,j),imgb(i,j),imgc(i,j),imgd(i,j)]';
        a=panjue(x,waterm,waterC,citym,cityC,treem,treeC);
        if a==1 %对应水体
            waterdiv(i,j)=255;
        end
    end
end
% imshow(waterdiv);
% imwrite(waterdiv, sprintf('result/%s.jpg','waterdiv'));

%%%%%%%%%分类为市区%%%%%%%%
citydiv=zeros(M,N);
for i=1:M
    for j=1:N
        x=[imga(i,j),imgb(i,j),imgc(i,j),imgd(i,j)]';
        a=panjue(x,waterm,waterC,citym,cityC,treem,treeC);
        if a==2 %对应城市
            citydiv(i,j)=255;
        end
    end
end
% imshow(citydiv);
% imwrite(citydiv, sprintf('result/%s.jpg','citydiv'));

%%%%%%%%%分类为植被%%%%%%%%
treediv=zeros(M,N);
for i=1:M
    for j=1:N
        x=[imga(i,j),imgb(i,j),imgc(i,j),imgd(i,j)]';
        a=panjue(x,waterm,waterC,citym,cityC,treem,treeC);
        if a==3 %对应植被
            treediv(i,j)=255;
        end
    end
end
% imshow(treediv);
% imwrite(treediv, sprintf('result/%s.jpg','treediv'));

%%%%%%%%%正确分类的结果%%%%%%%%
% waterdiv=waterdiv.*water;%水体正确分类结果
% citydiv=citydiv.*city;%市区正确分类结果
% treediv=treediv.*tree;%植被正确分类结果
divresult=zeros(M,N);%正确分类的结果
divresult=waterdiv.*water+citydiv.*city+treediv.*tree;
% imshow(divresult);
% imwrite(divresult, sprintf('result/%s.jpg','divresult'));

%%%%%%%%%%输出结果%%%%%%%%%%%
subplot(331); imshow(imga); title('可见蓝光'); axis on
subplot(332); imshow(imgb); title('可见绿光'); axis on
subplot(333); imshow(imgc); title('可见红光'); axis on
subplot(334); imshow(imgd); title('近红外波长'); axis on
subplot(335); imshow(imge); title('模板图像'); axis on
subplot(336); imshow(divresult); title('分类结果'); axis on
subplot(337); imshow(waterdiv); title('水体分类'); axis on
subplot(338); imshow(citydiv); title('市区分类'); axis on
subplot(339); imshow(treediv); title('植被分类'); axis on
% imwrite(imga, sprintf('result/%s.jpg','a'));
% imwrite(imgb, sprintf('result/%s.jpg','b'));
% imwrite(imgc, sprintf('result/%s.jpg','c'));
% imwrite(imgd, sprintf('result/%s.jpg','d'));
% imwrite(imge, sprintf('result/%s.jpg','e'));

计算均值方差函数:

function [m,waterC]=junzhifangc(M,N,imga,imgb,imgc,imgd,water,waterN)
%返回类的均值与方差
waterm=zeros(4,1);
% count=0;
for i=1:M
    for j=1:N
        if water(i,j)==1
            %模式向量分别求均值
            %count=count+1;
            %if count<=waterN %一半用于训练
                waterm(1)= waterm(1)+imga(i,j)/waterN;
                waterm(2)= waterm(2)+imgb(i,j)/waterN;
                waterm(3)= waterm(3)+imgc(i,j)/waterN;
                waterm(4)= waterm(4)+imgd(i,j)/waterN;
            %end
        end
    end
end
%求协方差矩阵
waterC=zeros(4,4);
% count=0;
for i=1:M
    for j=1:N
        if water(i,j)==1
            %count=count+1;
            %if count<=waterN %一半用于训练
                x=[imga(i,j),imgb(i,j),imgc(i,j),imgd(i,j)]';%均值向量
                x=im2double(x);
                waterC=waterC+x*(x')/waterN;
            %end
        end
    end
end
m=[waterm(1),waterm(2),waterm(3),waterm(4)]';
waterC=waterC-m*m';
end

判决函数:

function a=panjue(x,waterm,waterC,citym,cityC,treem,treeC)
%返回判决结果,123对应water,city,tree
m=[waterm(1),waterm(2),waterm(3),waterm(4)]';
m=im2double(m);
x=im2double(x);
%判决函数
d1=-log(det(waterC))-0.5*(x-m)'*inv(waterC)*(x-m);
m=[citym(1),citym(2),citym(3),citym(4)]';
d2=-log(det(cityC))-0.5*(x-m)'*inv(cityC)*(x-m);
m=[treem(1),treem(2),treem(3),treem(4)]';
d3=-log(det(treeC))-0.5*(x-m)'*inv(treeC)*(x-m);

if d1>=d2&&d1>=d3%判为水体
    a=1;
end
if d2>=d1&&d2>=d3%判为市区
    a=2;
end
if d3>=d1&&d3>=d2%判为植被
    a=3;
end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值