遥感原理实习报告Word格式.docx
- 文档编号:19311538
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:17
- 大小:1.08MB
遥感原理实习报告Word格式.docx
《遥感原理实习报告Word格式.docx》由会员分享,可在线阅读,更多相关《遥感原理实习报告Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
学习了GDAL读取和快速显示遥感影像的方法。
通过学习GDAL栅格数据处理库,使用它对遥感数据进行处理,包括读取数据、建立金字塔、提取地理信息、坐标转换等。
OpenCV:
OpenCV的全称是:
OpenSourceComputerVisionLibrary。
OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。
它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。
该库也有大量的Python,JavaandMATLAB/OCTAVE(版本2.5)的接口。
这些语言的API接口函数可以通过在线文档获得。
如今也提供对于C#,Ch,Ruby的支持。
可用于实时处理图像具有良好的可移植性,可以进行图像/视频载入、保存和采集的常规操作具有低级和高级的应用程序接口(API),提供了面向Intel
IPP高效多媒体函数库的接口,可针对你使用的Intel
CPU优化代码,提高程序性能。
2实现方法与过程
2.1前期准备:
本次实习老师一共布置了12个专题,每三个人组成一个小组,每个小组负责两个专题的制作,互有分工。
必选题部分我们小组的选题是K-均值分类,而选择题部分我们小组经过讨论之后决定选择边缘检测。
K均值算法能使聚类域中所有样品到聚类中心的距离平方和最小。
其主要步骤主要如下:
第一步:
任选k个初始聚类中心:
…,
(上角标记载为寻找聚类中的迭代运算次数).。
用数组classp[6*clsnumber]来存储类中心的值,一般可选定样品集的前k个样品作为初始聚类中心。
但是考虑到这样做不太有利于后面的算法收敛。
因此采用了最大最小距离选心法。
该法的原则是使各初始类别之间,尽可能地保持远离。
边缘检测部分是对灰度图用不同算子进行边缘检测的算法实现。
我们需要使用五种算子对图像进行边缘检测,分别是Sobel算子、Robert算子、Prewit算子、Laplace算子、Canny算子。
2.2框架的搭建:
本次实习我们小组选择的是VS2010平台,并通过创建win32控制台程序来进行程序的编写。
2.3opencv的配置:
本次实习我们需要自己动手配置opencv。
首先创建工程,并在工程的属性一栏里配置VC++属性的包含目录和库目录,接着再链接器的输入一栏里进行配置。
2.4K均值算法的编写:
K-means算法是最简单的一种聚类算法。
算法的目的是使各个样本与所在类均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准)
算法:
(1)任选K个初始聚类中心。
一般以开头K个样本作为初始中心。
(2)将模式样本集的每一样本按最小距离原则分配给K个聚类中心,即在第m次迭代时,若:
则
,
表示第m次迭代时,以第j个聚类中心为代表的聚类域。
(3)由步骤
(2),计算新的聚类中心,即:
式中Ni为第i个聚类域
中的样本个数。
其均值向量作为新的聚类中心,因为这样可以使误差平方和准则函数:
达到最小值。
(4)若
算法收敛,计算完毕。
否则返回到步骤
(2),进行下一次迭代。
代码实现:
voidmain()
{
Matimg,img1;
//img=imread("
E:
/tree.jpg"
);
//读入图像
/dragon.jpg"
img=imread("
/Jay.jpg"
if(img.empty())//程序茁壮性
{
cout<
<
"
cannotloadimage!
"
<
endl;
pleasecheck!
}
else
segmentation(img,img1,3);
//这数字是收到切换分成几类(默认两类)
imshow("
image_original"
img);
//显示原来的图像
image_kmeans"
img1);
//显示处理后的图像
waitKey();
}
intfindmin(double*dis,intn)
doublemin;
inttemp=0;
min=dis[0];
for(inti=1;
i<
n;
i++)
if(dis[i]<
min)
{
min=dis[i];
temp=i;
}
returntemp;
voidsegmentation(constMatimg,Mat&
img1,intn)
//img1=Mat:
:
zeros(src.size(),src.type());
img1=img.clone();
int**m=newint*[2*n];
//新旧共2n个均值点
int*nk=newint[n];
//每一类的个数
int*x=newint[n];
//算新旧均值点是否已经到达终止条件
double*dis=newdouble[n];
//待分的点到几个均值点的距离
int**sum=newint*[n];
//求新的一类中所有点的和三个通道
for(inti=0;
2*n;
m[i]=newint[3];
sum[i]=newint[3];
i++)//随机生成的n个初始中心
for(intk=0;
k<
3;
k++)
m[i][k]=img.at<
Vec3b>
(rand()/img.cols,rand()/img.rows)[k];
//随机生成初始点
for(inti=n;
i++)//另一组初始点置0
m[i][k]=0;
i++)//新旧聚类中心的差值
x[i]=abs(m[i+n][0]-m[i][0])+abs(m[i+n][1]-m[i][1])+abs(m[i+n][2]-m[i][2]);
intmink;
intcomp=0;
//新旧初始中心是否满足停止条件
inttimes=0;
//计算用时即迭代次数
if(x[i]>
0)
comp++;
while(comp)
for(inti=0;
nk[i]=0;
for(intk=0;
sum[i][k]=0;
img.rows;
for(intj=0;
j<
img.cols;
j++)
{
for(intk=0;
{
dis[k]=sqrt((img.at<
(i,j)[0]-m[k][0])*(img.at<
(i,j)[0]-m[k][0])+(img.at<
(i,j)[1]-m[k][1])*(img.at<
(i,j)[1]-m[k][1])+(img.at<
(i,j)[2]-m[k][2])*(img.at<
(i,j)[2]-m[k][2]));
//计算每个点到聚类中心的距离
}
mink=findmin(dis,n);
//找到距离最近的聚类中心
nk[mink]++;
//样本个数自增
sum[mink][0]+=img.at<
(i,j)[0];
//求和
sum[mink][1]+=img.at<
(i,j)[1];
sum[mink][2]+=img.at<
(i,j)[2];
}
m[i+n][k]=sum[i][k]/nk[i];
//均值向量作为新的聚类中心
x[i]=abs(m[i+n][0]-m[i][0])+abs(m[i+n][1]-m[i][1])+abs(m[i+n][2]-m[i][2]);
//计算新旧聚类中心的差值
m[i][k]=m[i+n][k];
//将新的聚类中心替换旧的聚类中心
comp=0;
if(x[i]>
comp++;
times++;
//迭代次数加一
cout<
timesis:
times<
/**********************************************************************************
最后一次分类结束后,在分类不会变化了,此时将每个类中用不同颜色标记
***********************************************************************************
for(intj=0;
//计算每个点到聚类中心的距离
mink=findmin(dis,n);
if(mink==0)
img1.at<
(i,j)[0]=255;
(i,j)[1]=0;
(i,j)[2]=0;
elseif(mink==1)
(i,j)[0]=0;
(i,j)[1]=255;
elseif(mink==2)
(i,j)[2]=255;
elseif(mink==3)
elseif(mink==4)
else
(i,j)[0]=255/n*mink;
(i,j)[1]=255/n*mink;
(i,j)[2]=255/n*mink;
//删除指针
delete[]nk;
delete[]x;
delete[]dis;
delete[]m[i];
delete[]m;
delete[]sum[i];
delete[]sum;
2.5边缘检测的编写:
算法原理:
Roberts算子
Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子。
它由下式给出:
其中f(x,y)是具有整数象素坐标的输入图像,平方根运算使该处理类似于人类视觉系统中发生的过程。
Sobel边缘算子
下图所示的两个卷积核形成了sobel边缘检测算子,图像中的每个点都用这两个核做卷积,一个核对通常的垂直边缘响应最大,而另一个对水平边缘响应最大。
两个卷积的最大值作为该点的输出位。
运算结果是一幅边缘幅度图象。
-1
-2
-1
1
2
-1
Prewitt边缘算子
下图所示的两个卷积核形成了prewitt边缘检测算子。
和使用Sobel算子的方法一样,图像中的每个点都用这两个核做卷积,取最大值作为输出。
Prewitt算子也产生一幅边缘幅度图象。
1
Canny算子
该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。
Canny边缘检测算法
step1:
用高斯滤波器平滑图象;
step2:
用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:
对梯度幅值进行非极大值抑制
step4:
用双阈值算法检测和连接边缘
Laplace算子
Laplace算子是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。
Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。
存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。
所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。
1
-4
0
当然,我们在数字图像处理的实习中已经实现过边缘检测的功能,在这里我们有现有的sobel、Laplace、canny的函数,我们根据老师的要求直接调用了这三个函数对图像进行了处理。
voidrobert(Matimg)//robert算子
for(inti=0;
i<
(img.rows-1);
i++)
j<
(img.cols-1);
img.at<
uchar>
(i,j)=sqrt((img.at<
(i,j)-img.at<
(i+1,j+1))*(img.at<
(i+1,j+1))+(img.at<
(i+1,j)-img.at<
(i,j+1))*(img.at<
(i,j+1)));
imshow("
image_robert"
waitKey();
voidprewit(Matimg)//prewit算子
Matimg1;
i<
for(intj=1;
img1.at<
(i-1,j-1)-img.at<
(i-1,j+1))*(img.at<
(i-1,j+1))
+(img.at<
(i,j-1)-img.at<
(i,j+1))
(i+1,j-1)-img.at<
(i+1,j+1))
(i+1,j-1))*(img.at<
(i+1,j-1))
(i-1,j)-img.at<
(i-1,j))*(img.at<
(i-1,j))
(i-1,j+1)-img.at<
(i+1,j+1)));
img.rows;
i++)//对边缘一圈像素取0
img1.at<
(i,0)=0;
(i,img.cols-1)=0;
for(intj=0;
img.cols;
(0,j)=0;
(img.rows-1,j)=0;
image_prewit"
Matimg,img_sobel,img_lap,img_canny;
CV_8UC1);
//将图像转为灰度图像
img_original"
Sobel(img,img_sobel,img.depth(),1,1);
//sobel算子,直接调用函数
img_sobel
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遥感 原理 实习 报告