数字摄影测量实习报告.docx
《数字摄影测量实习报告.docx》由会员分享,可在线阅读,更多相关《数字摄影测量实习报告.docx(11页珍藏版)》请在冰豆网上搜索。
![数字摄影测量实习报告.docx](https://file1.bdocx.com/fileroot1/2022-11/28/b4537e0f-bae2-4574-98ed-9d472d5363f3/b4537e0f-bae2-4574-98ed-9d472d5363f31.gif)
数字摄影测量实习报告
数字摄影测量实习报告书
学号:
20111000684
班级序号:
113112-05
姓名:
舒超
指导老师:
宋妍
成绩:
中国地质大学(武汉)
信息工程学院遥感科学技术系
2014年6月
目录
实习一:
Moravec算子点特征提取3
1.1实习目的:
3
1.2实习原理:
3
1.3实习步骤以及代码分析:
4
1.4结果分析:
8
实习二:
边缘提取算法10
2.1实习目的:
10
2.2实习原理:
10
2.3实习步骤以及代码:
10
2.4结果分析:
12
实习总结13
实习一:
Moravec算子点特征提取
1.1实习目的:
用程序设计语言(VisualC++或者C语言)编写一个完整的提取点特征的程序,通过对提供的图像数据进行特征点提取,输出提取出的点特征坐标。
本实验的目的在于让学生深入理解Moravec算子原理。
通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。
1.2实习原理:
Moravec角点检测算法是最早的角点检测算法之一。
该算法将角点定义为具有低“自相关性”的点。
算法会检测图像的每一个像素,将像素周边的一个邻域作为一个patch,并检测这个patch和周围其他patch的相关性。
这种相关性通过两个patch间的平方差之和(SSD)来衡量,SSD值越小则相似性越高。
如果像素位于平滑图像区域内,周围的patch都会非常相似。
如果像素在边缘上,则周围的patch在与边缘正交的方向上会有很大差异,在与边缘平行的方向上则较为相似。
而如果像素是各个方向上都有变化的特征点,则周围所有的patch都不会很相似。
Moravec会计算每个像素patch和周围patch的SSD最小值作为强度值,取局部强度最大的点作为特征点。
1.3实习步骤以及代码分析:
步骤流程图如下:
程序实现以及相关关键代码:
voidCMy2010302590183cylView:
:
OnMoravec()//读取图像以及相关算法
{
//TODO:
Addyourcommandhandlercodehere
CMmoravecDlgdlg;
dlg.DoModal();
CMy2010302590183cylDoc*pDoc=GetDocument();
LPSTRm_pDIB=(LPSTR):
:
GlobalLock((HGLOBAL)pDoc->hdib);//得到句柄内存起始地址存放位图数据hdib句柄变量存放BMP位图
:
:
GlobalUnlock((HGLOBAL)pDoc->hdib);
LPBITMAPINFOm_pBMP;//指向BITMAPINFO结构的指针
m_pBMP=(LPBITMAPINFO):
:
GlobalLock(pDoc->hdib);
//获取指向BITMAPINFO结构的指针
:
:
GlobalUnlock((HGLOBAL)pDoc->hdib);
intBitCount=m_pBMP->bmiHeader.biBitCount;
DWORDWidth=:
:
DIBWidth(m_pDIB);//获取位图宽
DWORDHeight=:
:
DIBHeight(m_pDIB);//获取位图高
LPBYTElpData=(LPBYTE):
:
FindDIBBits(m_pDIB);//定义字符指针变量,原位图指针
intWidthBytes=WIDTHBYTES(Width*BitCount);//获取字节
DWORDpixelCount=WidthBytes*Height;
intck1=dlg.c1;
intck2=dlg.c2;
doubleyz=dlg.m_yuzhi;
DWORDr,c;
INTh;
double*xx=newdouble[Width*Height];
intk;
k=INT(ck1/2);
for(r=ck1/2;rfor(c=ck1/2;c{
doublemin,v[4]={0.0};
for(h=0;h<=ck1-1;h++){
v[0]+=pow((double)(*((BYTE*)(lpData+r*WidthBytes+(c-k+h)))-*((BYTE*)(lpData+(r)*WidthBytes+(c-k+1+h)))),2);//0°方向
v[1]+=pow((double)(*((BYTE*)(lpData+(r-k+h)*WidthBytes+(c+k-h)))-*((BYTE*)(lpData+(r-k+h+1)*WidthBytes+(c+k-h-1)))),2);
//45°方向
v[2]+=pow((double)(*((BYTE*)(lpData+(r-k+h)*WidthBytes+(c)))-*((BYTE*)(lpData+(r-k+1+h)*WidthBytes+(c)))),2);
//90°方向
v[3]+=pow((double)(*((BYTE*)(lpData+(r-k+h)*WidthBytes+(c-k+h)))-*((BYTE*)(lpData+(r-k+1+h)*WidthBytes+(c-k+h+1)))),2);
//135°方向
}
min=min(min(min(v[0],v[1]),v[2]),v[3]);
//求出v1,v2,v3,v4中的最小值
if(min>yz)
xx[r*Width+c]=min;
}
bool*bMatrix=newbool[Width*Height];
memset(bMatrix,0,Width*Height*sizeof(bool));
DWORDx,y;
doublemax2;
boolb=false;
inttempX(0),tempY(0);
for(x=ck2/2;x{
for(y=ck2/2;y{
max2=0;
for(DWORDm=(x-ck2/2);m<(x+ck2/2);m++)
{
for(DWORDn=(y-ck2/2);n<(y+ck2/2);n++)
if(xx[m*Width+n]>max2)
{
max2=xx[m*Width+n];
tempY=m;
tempX=n;
b=true;
}
}
if(b)
{bMatrix[tempY*Width+tempX]=1;}
}
}
intsum=0;//特征点总数
for(DWORDi=0;ifor(DWORDj=0;j{
if(bMatrix[i*Width+j])
{
*((BYTE*)(lpData+i*WidthBytes+j))=0;
*((BYTE*)(lpData+i*WidthBytes+j+1))=0;
*((BYTE*)(lpData+i*WidthBytes+j-1))=0;
*((BYTE*)(lpData+(i+1)*WidthBytes+j))=0;
*((BYTE*)(lpData+(i-1)*WidthBytes+j))=0;
*((BYTE*)(lpData+i*WidthBytes+j+2))=0;
*((BYTE*)(lpData+i*WidthBytes+j-2))=0;
*((BYTE*)(lpData+(i+2)*WidthBytes+j))=0;
*((BYTE*)(lpData+(i-2)*WidthBytes+j))=0;
sum++;
}
}
if(sum<4000)
{
CStringstrInfo;
strInfo.Format("特征点数%d\n",sum);
MessageBox(strInfo,"提示",MB_OK);
}
else
{
CStringstrInfo;
strInfo.Format("特征点数较多,请设置合理参数");
MessageBox(strInfo,"提示",MB_OK);
}
Invalidate();
}
1.4结果分析:
按照提示,对老师所给数据进行分析,当窗口大小设置为5*5,,阈值设置为5000的时候,对右核线影像进行分析,得到特征点43个,同时图像分析,得出如下结果:
调整阈值和窗口大小,程序能够正常运行,且经过测试,结果精确度有较好的保证。
实习二:
边缘提取算法
2.1实习目的:
熟悉Matlab环境下的编程,熟悉边缘提取算法。
2.2实习原理:
Sobel算子实现思路如下:
对输入图像分别使用水平和垂直模板做卷积计算,对得到的两个处理结果求平方和,该平方和与阈值的平方比较。
只有当某点的两种卷积的平方大于阈值的平方,且水平占优(水平模板卷积结果大于垂直模板卷积的结果,且该点的卷积平方大于其左右两点的卷积平方和)或者垂直占优(垂直模板卷积的结果大于水平模板卷积的结果,且该点的卷积平方和大于其上下两点的卷积平方和)时,该点的输出结果为255,否则为0。
输出的结果为二值图像。
第一行和最后一行本来就是图像边界,不包括可用信息,因此相应的输出为0,按照这个思路课题编写了相应的Sobel算子实现程序
2.3实习步骤以及代码:
2.4结果分析:
原图像sobel边缘提取
实习总结
本次实习过程中,根据自身实际情况,我选择使用vc环境下的编程完成实习,而没有采用Matlab环境下的编程。
在实习过程中,我熟悉了sobel算法以及Moravec算子,在程序调试的过程中,我认识到任何算法都有其局限性,比如说本次实习过程中,sobel算子的边缘提取就将许多的噪音提取了出来,导致边缘特征提取的不准确性。
本次实习让我认识到了编程能力的重要性,学会编写基本的代码来实现基本的算法,能让我们摆脱软件已有算法的束缚,更多的按照需要来实现一些步骤。
总体来说,本次实习还是很成功的,让我认识到,在以后的学习生活中,我认识到,应该把理论和实践结合起来,多锻炼自己的动手能力,好好把握住每一次实习的机会.