基于单分类器的高分辨率遥感影像道路提取

本人硕士阶段做了很久的高分辨率遥感影像道路提取,颇有心得,在此,本人将最新的研究成果进行开源。。。

大家都知道,传统的基于机器学习的分类方法通常需要正负样本的同时参与,才能得到目标类,但是负样本的勾选,通常很困难,也非常难获得,根据文献-

《Elkan, Charles, and Keith Noto. "Learning classifiers from only positive and unlabeled data." Proceedings of the 14th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2008.》中提出的方法,本人构建了一种单样本分类器,其中原理如下:

根据上面原理,本人基于传统的随机森林算法,构建了单分类器,random forest positive and unlabeled learning classifer,matlab 代码如下所示:

这是主要的单分类器函数:

function Pro= RF_pul(sample,Image,train,r_pul,ntree,depth)
%positive and unlabeled learning ,finished by wang zhipan, southwest
%jiaotonguniversiy;

% sample:the number of train samples,the first column is column in original
% image,the second column is row in original image

% Image:the original image

% train :the ratio of trained sample,
% r_pul: the ratio between positive samples and unlabed samles

% ntree:default 200;
% depth : default 2;

if nargin<3
    train=0.75;
    r_pul=1;
    ntree=200;
    depth=2;
elseif nargin<4
    r_pul=1;
    ntree=200;
    depth=2;
elseif nargin<5
    ntree=200;
    depth=2;
elseif nargin<6
    depth=2;
end

[m_train,n_train]=size(sample);
n_train=n_train-2;

[m,n,~]=size(Image);

for i=1:n_train
    predict(:,i)=reshape(Image(:,:,i),m*n,1);
end

%% train matrix
rand_negtive=randperm(m*n)‘;
n_tr=floor(m_train*train+(m_train*train*r_pul));

Train_matrix=zeros(n_tr,n_train); % the matirx used to train
Label_train=zeros(n_tr,1);  %label
Label_train(1:m_train*train,1)=1;
Label_train(m_train*train+1:end,1)=0;

Train_matrix(1:m_train*train,1:end)=sample(1:m_train*train,3:end);

for i=1:m_train*train*r_pul
    Train_matrix(floor(m_train*train)+i,:)=predict(rand_negtive(i),:);
end

%% predictmatirx
min_val=min(predict);
max_val=max(predict);

for i=1:n_train   %linear normlized
    predict(:,i)=(predict(:,i)-min_val(i))./(max_val(i)-min_val(i));
    Train_matrix(:,i)=(Train_matrix(:,i)-min_val(i))./(max_val(i)-min_val(i));
end

model = classRF_train(Train_matrix,Label_train,ntree,depth);

[~,votes] = classRF_predict(predict,model);
g=votes./ntree;  %use the number of tree the stand for probability

G=reshape(g(:,2),m,n);

valid_index=sub2ind([m,n],sample(m_train*train+1:end,2),sample(m_train*train+1:end,1));

c=mean(G(valid_index));  % the c in paper,we use mean value of all data

Pro=mat2gray(G./c);  %Normalized Probability
end

下面写一个script,进行运行:

%% test RF_pul
clear
tic

Text=textread(‘Sample3.txt‘);
[Img,ref]=geotiffread(‘test3.tif‘);% 获取坐标信息
Img=double(Img);
info=geotiffinfo(‘test3.tif‘);
[m,n,z]=size(Img);

Sample=zeros(size(Text,1),5);
Sample(1:end,1:2)=Text(1:end,2:3);  %以行列的形式存储原始影像坐标,其中第一列表示原始影像中的列,第二列表示原始影像中的行
Sample(1:end,3:end)=Text(1:end,8:end); % 存储特征
clear Text

Pro= RF_pul(Sample,Img);
Proimg=reshape(Pro,m,n);
clear Pro Img
figure,imshow(Proimg),title(‘后验概率‘);

geotiffwrite(‘Probility.tif‘,Proimg,ref,‘GeoKeyDirectoryTag‘, info.GeoTIFFTags.GeoKeyDirectoryTag);

toc

  得到的最终结果如下所示:

尽请各位同行批评指正,如果对代码有比较难理解的地方,欢迎联系,手机:13094445837,qq1044625113

时间: 2024-10-10 04:28:27

基于单分类器的高分辨率遥感影像道路提取的相关文章

深度学习高分辨率遥感影像语义分割【转】

原文link: https://www.cnblogs.com/wzp-749195/p/11114624.html 深度学习大家都知道,在计算机视觉领域取得了很大的成功,在遥感影像自动解译方面,同样带来了快速的发展,我在遥感影像自动解译领域,也做了一些微薄的工作,发表几篇论文,我一直关注遥感影像自动解译领域, 在北京出差的这段时间,终于可以沉下心来,好好研究下深度学习,目前在语义分割领域,也有部分心得,在此同大家分享,权当是互相学习.本篇博文就是论述现有的state-of-art方法在遥感影像

基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!

1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA); //设置方式2 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 从遥感影像数据中提取出像素数据,可将其中的R.G.B三通道依次赋值给OpenGL的像素缓冲区对象 (PBO,Pixel Buffer Obje

基于GPU的高分一号影像正射校正的设计与实现

一 RPC正射校正的原理 影像正射校正的方法有很多,主要包含两大类:一类是严格的几何纠正模型,另一类是近似几何纠正模型.当遥感影像的成像模型和有关参数已知时,可以根据严格的成像模型来校正图像,这种方法属于严格几何纠正,最具代表的是共线方程法.当传感器成像模型未知或者无法获取相关的辅助参数时,可以用假定的数学模型模拟成像模型,对影像实现校正,这种方法属于近似几何纠正,主要有:几何多项式纠正.有理函数法.局部区域校正等模型.本文将主要对RPC正射校正模型进行展开讨论. RPC模型将像点坐标d(lin

1. GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)

一.前言 GDAL具有强大的图像读写功能,但是对常用图像处理算法的集成较少,OpenCV恰恰具有较强的图像处理能力,因此有效的结合两者对图像(遥感影像)的处理带来了极大的方便.那么如何实现GDAL与openCV间的数据交换成为影像处理中的关键步骤.接下来我将记录下:1 如何将GDAL读取的影像转化为openCV支持的的MAT格式?2 如何将处理后MAT数据转化为合适的图像格式存储?(PS:本人也是初次使用GDAL和openCV,代码很水...只是记录下自己学的,和大家交流下) 二.GDAL数据到

GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)

一.前言 GDAL具有强大的图像读写功能,但是对常用图像处理算法的集成较少,OpenCV恰恰具有较强的图像处理能力,因此有效的结合两者对图像(遥感影像)的处理带来了极大的方便.那么如何实现GDAL与openCV间的数据交换成为影像处理中的关键步骤.接下来我将记录下:1 如何将GDAL读取的影像转化为openCV支持的的MAT格式?2 如何将处理后MAT数据转化为合适的图像格式存储?(PS:本人也是初次使用GDAL和openCV,代码很水...只是记录下自己学的,和大家交流下) 二.GDAL数据到

Matlab计算多幅遥感影像交集面积占比

一个文件夹中有同一时间不同的遥感影像,有LST NDVI.反射率等,而想要知道这些像元数量相同,填充值和背景值均为nan的影像的交集部分占该影像研究区(已经经过研究区矢量裁剪)的比例,以及不同类别遥感影像的覆盖面积比例,主要目的是想以多种数据交集覆盖面积比例来判断改天是否适合数据反演 1 函数 函数基本结构 function[输出形参表: output1, ...,outptn] = 函数名(输入形参表: input1, ... , inputn) 注释说明部分 函数体代码部分 end 函数名:

遥感影像滤波处理软件 — timesat3.2

最近因为要做遥感影像的滤波处理,经过女神推荐,决定用Timesat,可是该软件3.1版本只适合xp系统以及2011的matlab,后来在官网上找到了最新的3.2版本.支持64位操作系统以及2014的matlab.大家可以直接上官网(http://www.nateko.lu.se/TIMESAT/timesat.asp )注册下载,但是有一个问题是,官网注册的时候,会用到Google公司的rechaptcha验证码系统,因为大天朝的墙太高了,所以是刷不出来的,可以选择挂vpnFQ下载.如果不想FQ

遥感影像显示相关的技术总结

遥感影像显示相关的技术总结 前言 从事遥感影像和图像处理有一段时间了,今天就把遥感影像显示相关的技术和大家分享一下. 平常我们用的GIS软件或者说遥感软件都能讲遥感影像的数据显示在屏幕上,并且有些显示效果还不错,其中ENVI的显示效果是业界做得比较好的,尤其是ENVI5.0之后的大视图,能够根据真彩色的波段自动选择波段进行显示.遥感影像显示其实就是图像显示,和我们生活中常见的图像显示没有太大区别,基本上原理是一样的,但也有自己独特的地方,之后会讲到.首先,我们来看看图像显示的基本过程,即图像是怎

在matlab中实现遥感影像和shp文件的结合显示

clc;close all;clear; road=shaperead('boston_roads.shp'); %读取shape文件 figure, mapshow('boston.tif'); %读取tif遥感影像并显示 axis image manual off; %关闭本地坐标系统 surveyFeetPerMeter = unitsratio('sf','meter'); %将米级单位转换成surveyFeet单位 colorTab='rgbcymkw'; %颜色代码表,不同等级的公路