当前位置:   article > 正文

遥感影像校正效果检测系统代码设计与实现_遥感影像正射校正c++代码

遥感影像正射校正c++代码

 

随着遥感技术的发展, 人类可以获取的遥感数据类型越来越丰富, 获取的遥感数据量越来越庞大, 当前计算机技术的飞速发展, 促进了遥感影像的处理技术和处理效率进一步增强。这也加速推进了遥感影像在民用和军事领域发挥了越来越重要的作用, 在众多的行业得到广泛应用。

 

遥感影像受地球球面、大气环境、云层等的影像, 会产生畸变, 因此初始影像传输到地面后, 要进行数据校正, 其校正的原理是利用一组地面控制点对初始影像的几何畸变过程进行数学模拟、建立畸变的卫星影像空间与地理制图标准空间(也称校正空间) 之间的对应数学函数关系, 并利用这种函数关系把畸变空间中的全部元素变换到校正图像空间,从而实现数据校正, 在校正完成后, 通常需要的校正后的遥感影像数据进行校正效果的检测。

 

大型遥感影像校正效果检测系统的设计, 并用VS2010 开发环境对系统进行了实现。

 

1 影像加载

 

遥感影像校正效果的检测, 可通过将处理后的影像与标准影像进行叠加, 通过抽样方式对局部地区进行放大显示,通过观察两幅图的像素误差大小来考量校正处理的效果, 不同的应用对影像的误差要求不同, 一般要求不超过一个像素左右的误差。

 

影像加载要加载两幅影像, 为了满足能够检测大型影像的需求, 在加载影像时不能简单地将影像读入的计算机内存,因为有的影像数据大小可能会超过几百个GB, 所以在加载时, 应该对影像建立外部“金字塔” 数据, 这样才会在后续的显示处理中提高效率。影像金字塔结构指在同一的空间参照下, 根据用户需要以不同分辨率进行存储与显示, 形成分辨率由粗到细、数据量由小到大的金字塔结构。影像金字塔结构用于图像编码和渐进式图像传输, 是一种典型的分层数据结构形式, 适合于栅格数据和影响数据的多分辨率组织,也是一种栅格数据或影像数据的有损压缩方式。

 

金字塔分层的原理。建立影像的金字塔时, 要以多线程的方式, 通过进度条来显示建立金字塔的进度。

 

                                  金字塔分层原理

2 影像快速显示

 

影像数据体量比较大, 为了提高影像的显示速度, 主要采用以下几个途径:

(1) CPU 和GPU 并行运行, 采用NVIDIA 的新一代图形控制器已具有一定的可编程控制能力, 和CPU 并行工作则可以使系统效率达到最高。在软件/硬件设计上尽量考虑减少CPU/GPU 之间的同步操作, 使它们异步运行从而使系统的响应速度进一步提高。这种机制在1 台微机插有多块图形卡时

优越性更为明显, 因为多个图形卡之间也具有了并行度。

(2) 充分利用RGBA 4 个颜色通道, 在不可避免要出现回读操作的时候, 充分利用彩色图像的RGBA 4 个通道可以降低数据传输量。由于有些遥感影像是单波段影像, 一般是灰度图像, 因此可用RGBA 中任一分量表示1 个像素的灰度, 1次可以传输4 幅灰度图像的像素数据, 这样可以加快影像显示速度。

(3) 通过优化绘制区域避免重复绘制, 在进行影像漫游时, 这是常见的一种处理方式, 图像在漫游前后, 显示的影像区域一般会有一部分重复绘制的区域, 将这些区域保留在显存内, 避免重复加载数据, 会大大提升显示效率。

 

3 影像叠加卷帘比对

 

遥感影像校正效果的检测, 需要将处理后的影像与标准影像进行叠加, 通过卷帘的方式, 才能完成比对, 在设计上,为了突出处理后的影像, 在叠加顺序上默认将处理后的影像叠加在标准影像上方, 当然, 叠加的次序可以由用户进行设定, 在卷帘方向上提供水平和垂直两个方向, 如下图所示。

 

                             水平卷帘和垂直卷帘

4 主要代码实现

 

系统基于VS2010 开发环境, 使用C++语言开发, 依据前面的设计思路, 主要创建了遥感影像处理类和影像显示交互类。

 

4.1 遥感影像处理类

 

影像处理类主要解决影像的加载、运用多线程建立影像金字塔以及根据特定的图像句柄实现影像的快速绘制等功能。其类的主要定义如下:

 

class CSarImage:public CImage

{

public:

CString m_FileName; //影像文件名

CDC * pDC; //绘制影像的设备指针

int m_nBandCount; //影像的波段数量

int m_SarImgWidth; //影像宽度

int m_SarImgHeight; //影像高度

double m_dScale; //影像的显示比例

//影像变化矩阵

double m_dTransform[6];

//当前显示区域中心点坐标

CvPoint2D32f m_CenterPt;

CWinThread *pThread; //多线程指针

int m_DaiHao; //影像所在的分带号

CVIMGVIEW m_cvImg;

sarDrawRect m_DrawRects;

int m_splitLine; //卷帘分界线的位置

//获取交叉区域,得到应该画的图像区域

void GetCrossRect (CRect ClientRect,CRect &DrawRect,

CRect &bmpRect);

public:

CSarImage();//构造函数

//构造函数重载

CSarImage(CString fileName);

//得到图像大小,波段数量信息

void GetSarImageInfo();

//绘制影像

void SarShow (CWnd *p_win,CvPoint2D32f centerPt,double

dScale);

void SarShow(CWnd *p_win);

//满客户区显示

void SarFullClientShow(CWnd *p_win);

void CreateInnerPyamids(); //创建金字塔

//在指定窗口的指定区域绘制OPENCV 图像

void Show_vcImage( IplImage* img, CWnd *pwin ,CRect r );

//获取影像所在的分带号

int GetDaiHao();

};

 

4.2 影像显示交互类

 

影像显示交互类, 主要完成影像的显示, 响应用户的鼠标交互操作, 主要包括影像的放大、缩小、漫游、水平卷帘和垂直卷帘等功能。鼠标的按键设计, 通过左键实现图像的漫游, 通过滚轮也可实现影像的缩放, 通过按下中建可以实现漫游, 通过鼠标右键的拖拉, 实现影像的卷帘操作。其类的主要定义如下:

 

class CVerifyCorrectionView : public CView

{

protected: DECLARE_DYNCREATE(CVerifyCorrectionView)

public:

CVerifyCorrectionDoc* GetDocument()

public:

//当前的鼠标状态,11-放大,12 缩小,13,移动,20-右键分开

int m_State;

int m_preState; //鼠标的前一个状态

BOOL m_isUpDown; //是否水平卷帘CPoint ptStart;

//鼠标的起点

CPoint ptEnd; //鼠标终点

CSarImage m_sarBaseImg; //标准影像

CSarImage m_sarResultImg;//校正处理后的影像

CBitmap* m_pBackBitmap;

BOOL m_isRButtonDown;

//重新设置影像的显示比例及中心点

void ResetImgScale(CPoint startPt,CPoint endPt);

//根据标准影像绘制结果影像

void DrawResultImgByBaseImg();

//清除客户区的图像,以白色填充

void ClearClientRect();

//抓取客户区

void CaptureClient();

void OpenBaseImg(CString file);

void OpenResultImg(CString file);

void SetCursorStyle();//设置鼠标状态

//设置图像的分割方式

void SetImgFGFS(int algent);

public:

// 重写以绘制该视图

 

virtual void OnDraw(CDC* pDC);

protected:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

public:

// 主要的消息映射函数

protected:

afx_msg void OnFilePrintPreview();

afx_msg void OnRButtonUp(UINT nFlags, CPoint point);

afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);

DECLARE_MESSAGE_MAP()

public:

afx_msg void OnImportBaseImg();

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

afx_msg void OnMouseMove(UINT nFlags, CPoint point);

afx_msg void OnZoomIn();

afx_msg void OnFullShowImg(); //满屏显示

afx_msg void OnImportResultImg();

afx_msg void OnMoveImage();

afx_msg void OnZoomOut();

afx_msg void OnFactSize(); //以实际大小显示

afx_msg void OnMButtonDown(UINT nFlags, CPoint point);

afx_msg void OnMButtonUp(UINT nFlags, CPoint point);

afx_msg BOOL OnMouseWheel (UINT nFlags, short zDelta,

CPoint pt);

};

 

5 系统界面

                         系统主界面

                           放大影像提高检测精度

 

系统运行的主界面如图3 所示, 系统加载的我国辽宁省鞍山地区的遥感影像, 基准影像是单波段影像(以灰度图显示), 校正后的影像是多波段影像(以RGB 着色显示), 加载影像后, 可在左侧的面板中显示加载的基准影像和校正后的影像的详细信息, 包括影像的保存位置、文件大小、影像的像素宽度和高度、影像的左上角起点坐标值、影像的分辨率、影像的波段数目等。由图上的像素信息可以看到, 两个影像的数量还是比较大的。

可以通过鼠标的各种操作实现影像的缩放和漫游, 通过拖拉鼠标的右键可以实现卷帘操作, 通过抽样观察不同的区域, 来检测影像的校正效果。通过属性面板可以控制卷帘的方向和影像叠加的次序。系统经过测试, 可以加载500GB 以上的影像进行比对检测, 在效率上几乎没有下降, 通过对影像的放大比对, 可以使检测精度在0.2 个像素级以上, 如图所示。

 

本文摘自《大型遥感影像校正效果检测系统设计与实现》一文。

更多遥感和GIS知识,关注我微信公众号

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/1011683
推荐阅读
相关标签
  

闽ICP备14008679号