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

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

 

前言

    从事遥感影像和图像处理有一段时间了,今天就把遥感影像显示相关的技术和大家分享一下。

    平常我们用的GIS软件或者说遥感软件都能讲遥感影像的数据显示在屏幕上,并且有些显示效果还不错,其中ENVI的显示效果是业界做得比较好的,尤其是ENVI5.0之后的大视图,能够根据真彩色的波段自动选择波段进行显示。遥感影像显示其实就是图像显示,和我们生活中常见的图像显示没有太大区别,基本上原理是一样的,但也有自己独特的地方,之后会讲到。首先,我们来看看图像显示的基本过程,即图像是怎么显示在计算机屏幕上的。

 

1、影像显示基本过程

    首先,CPU从存储介质中读取数据,存储介质可以是本地磁盘、移动存储设备以及远程服务器。然后将数据存储在内存缓冲区里面,然后读数器将这里面的数据根据彩色查找表转换为RGB的形式。然后模数转换器将RGB形式的数据值转换为适当的电信号,这样就得到模拟信号,该模拟信号调整RGB电子枪的强度,控制着每个像素在视频CRT屏幕上显示的亮度。

 

1.1全色显示(灰度显示)

    比如我们的遥感影像数据源,有很多数据时全色波段,例如高分一号的全色波段就是2米分辨率的,那么这个数据时如何显示在屏幕上?如果数据时8位的,即byte型,那么可以做拉伸也可以不用拉伸直接显示在屏幕上。这里就需要用到8位的图像处理器,它是一个8位连续的256个元素的查找表,并且RGB每个分量都是同一个值。比如黑色就是RGB(0,0,0)白色就是RGB(255,255,255)。最后通过数模转换显示在屏幕上。

 

1、2彩色显示

    说到彩色显示,可能更复合我们人眼的观察,分辨的能力更强。彩色显示主要用两种方案,一种是电子显示法,在数字图像显示中主要用这种方法。它是用彩色监视器显示,有时候将这种显示叫做软拷贝。另外一种是用彩色硬拷贝设备进行显示。这种显示方法主要用再印刷中,通常需要将RGB颜色空间转换到CYMK颜色空间,这种显示不在我们的讨论范围之内。

    对于遥感影像,如果选择的波段与RGB是一一对应的,那么显示出来的效果即为真彩色效果,接近于人类肉眼观察到的效果。如果输入波段与RGB不相对应,那么僵产生假彩色效果,就和我们人眼观察的效果有较大区别。

 

2、图像的拉伸

    图像拉伸主要是增强图像的显示效果,如果图像的对比度比较低,那么就无法看清楚地物,这时需要拉伸。另外一个方面,对于非8位的数据,我们一般也做拉伸处理后再显示。一般的拉伸有线性拉伸和非线性拉伸两种方法。

    线性拉伸主要有全域线性拉伸,分段线性拉伸等。具体有最大-最小值拉伸、标准差拉伸。非线性拉伸主要有指数拉伸,对数拉伸等。对于多波段的遥感影像,一般是将各个波段分别拉伸后,然后进行波段组合后显示。

 

3、编程方面的一些细节

3.1影像IO   

    对于遥感影像的读取,绝对推荐GDAL来做,你自己来解析的话很累。在某些需要提高IO速度的地方可以先将数据转储为一个裸数据,然后通过内存映射文件的方式来做,这样的效率很高。需要注意的一个地方是每次映射的时候要分块映射,在windows系统中,系统分配的粒度是64k,可以每次映射这么大的数据,分多次映射,每次映射的起始偏移量必须是64k的整数倍,偏移量是以字节为单位。

 

3、2关于拉伸的实现

首先是最大最小值拉伸,先在原始影像中统计最大最小值。最大和最小值拉伸的代码如下:

void MinMaxStreh(unsigned char* poData,int nLen,double dbMin,double dbMax)
{
	#pragma omp parallel for
	for (int i = 0;i < nLen; i ++)
	{
		poData[i] = double(poData[i]-dbMin)/(double)(dbMax-dbMin) * 255;

	}
}


另外一种比较常用的拉伸方法是标准差拉伸,这种拉伸方法实际上也是最大最小值拉伸,只不过在拉伸强需要先将最大最小值计算出来。代码如下:

 

//图像的标准差拉伸
template <typename T>
void StandDevStreh(const T* poData,unsigned char* puBytes,int nLen,double dbDev,int nDevCount,double dbMean)
{
	#pragma omp parallel for
	for (int i = 0;i < nLen; i ++)
	{
		double ucMax  = dbMean + nDevCount * dbDev;
		double ucMin  = dbMean - nDevCount * dbDev;

		if (poData[i] < ucMin)
		{
			puBytes[i] = 0;
		}

		else if (poData[i] > ucMax)
		{
			puBytes[i] = 255;
		}

		else if (poData[i] >= ucMin && poData[i] <= ucMax)
		{
			puBytes[i] = double(poData[i]-ucMin)/(double)(ucMax-ucMin) * 255;
		}

	}
}

 

    这里的拉伸都需要对原始影像做统计,如果是对整个波段的原始数据逐个统计,如果图像很大的话,速度绝对的慢,那么可以将原始影像的数据读到一个256*256的缓冲区里面或者512*512的缓冲区,也可以按照比例缩放,比如X方向上定死512个像素,那么Y方向的像素的个数就可以根据原始影像波段的高度和宽度之比来计算得到。通过一个小的缓冲区统计出来的值和原始数据统计出来的值差别很小,因为是对原始影像的抽样,概率密度分布基本上是一样的。

 

3.3、关于影像黑边的显示处理

影像黑边的话,可以默认显示,也可以将它过滤掉,比如将黑边显示为白色,其效果如下:

 


有黑边的显示



无黑边的显示

3.4、关于和矢量数据的叠加

    这个需要注意的是要根据地理坐标进行计算显示的像素范围。首先将屏幕当前显示的地理范围和影像的地理范围求交集,然后将这个交集映射到影像的行列号,即可以取到数据进行显示了。待显示的数据缓冲区大小是地理范围求交集所占的屏幕像素的大小。具体可以参考我的另外一篇博客:http://blog.csdn.net/zhouxuguang236/article/details/21882801

 

3.5、关于优化显示效果

    这里讲一讲如何处理影像黑边对波段统计结果的影像。如果将黑边统计进去,然后进行拉伸的话,势必会对影像的显示效果产生影像,一般影像的黑边是原始数据经过正射校正或者匹配校正后产生的,总之,对图像进行纠正后都会产生黑边。其实,校正后的黑边面积比较大,可以按照3.2中提到的方法,进行统计时过滤掉黑边,具体操作可以在进行直方图统计时将比例最大的那一部分看成黑边,然后找到这个值,最后计算均值标准差的时候过滤掉就可以了。这只是我想到的一种方法,有没有更好的方法,敬请期待!下面两幅图是没有过滤黑边和过滤掉黑边显示效果的对比,明显过滤掉黑边后进行标准差拉伸更接近真彩色效果。

 


没有对黑边处理的效果



对黑边处理的效果


对比这两幅图,效果明显的是统计时过滤掉黑边的效果较好。


对于过滤掉黑边的统计函数如下:

#define TILE_SIZE 256

bool GeoGdalImageLayer::GetBandStatisInfoEx(
	int nChannelIndex, 
	float* pfHist, 
	float& fMax, 
	float& fMin, 
	float& fMean, 
	float& fVar, 
	float fExclude) const
{
	GDALDataset *poDataset = (GDALDataset*)m_poDataset;
	if (NULL == poDataset)
	{
		return false;
	}

	assert(NULL != poDataset);
	int nXsize = poDataset->GetRasterXSize();
	int nYsize = poDataset->GetRasterYSize();
	int pBandList[1] = {nChannelIndex+1};

	int nTileHeight = ( nYsize/float(nXsize) ) * TILE_SIZE;

	float *pBytes = new float[TILE_SIZE*nTileHeight];

	poDataset->RasterIO(GF_Read,0,0,nXsize,nYsize,pBytes,TILE_SIZE,nTileHeight,GDT_Float32,1,pBandList,0,0,0);

	std::vector<float> vecPixels;
	vecPixels.resize(TILE_SIZE*nTileHeight);

	int nCount = 0;
	double dbSum = 0;

	//开始统计
	fMax = DBL_MIN;
	fMin = DBL_MAX;
	for (int i = 0; i < TILE_SIZE*nTileHeight; i ++)
	{
		if (fabs( pBytes[i] - fExclude) <= 0.000001)
		{
			continue;
		}

		else
		{
			if (pBytes[i] <= fMin)
			{
				fMin = pBytes[i];
			}

			if (pBytes[i] >= fMax)
			{
				fMax = pBytes[i];
			}

			dbSum += pBytes[i];
			vecPixels[nCount] = pBytes[i];
			nCount ++;
		}
	}

	//计算均值
	fMean = dbSum/nCount;

	//计算标准差
	dbSum = 0;
	for (int i = 0; i < nCount; i ++)
	{
		dbSum += (vecPixels[i]-fMean)*(vecPixels[i]-fMean);
	}
	dbSum /= nCount;
	fVar = sqrt(dbSum);

	if (pBytes != NULL)
	{
		delete []pBytes;
		pBytes = NULL;
	}
	return 1;
}


3.6、关于影像的自动校正显示

    这个以前有碰到过这个需求,但是目前还没有实现。例如高分一号数据的自动校正显示,SPOT原始数据的自动校正显示等。这个可以再显示前做重采样实现。

 

4、总结

    以上都是个人总结,如有不妥之处,也请指出来共同探讨。影像显示的界面框架是QT界面库实现,具体的绘制通过OpenGL来绘制。其实说实在的,这个显示效果和ENVI的显示效果差太多了,还得研究ENVI的显示机制。

 

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 在Qt5中实现遥感影像显示可以通过使用QGraphicsView类来实现。QGraphicsView是Qt中提供的用于显示大量图形对象的显示组件,非常适合用来显示遥感影像。下面是实现的步骤: 1. 创建一个Qt Widgets应用程序,并在主窗口中添加一个QGraphicsView控件。 2. 在代码中引入QGraphicsPixmapItem类,用于将遥感影像以图像的形式添加到QGraphicsView中。 3. 读取遥感影像数据文件,并创建一个QImage对象来保存影像数据。可以使用QImage类提供的load方法来加载图像文件。 4. 将QImage对象转换为QPixmap对象,并将其与QGraphicsPixmapItem关联起来。可以使用QPixmap类提供的fromImage方法来完成转换。 5. 将QGraphicsPixmapItem添加到QGraphicsView中,从而实现遥感影像显示。 6. 可以通过设置QGraphicsView的缩放、平移和旋转等操作来实现对遥感影像的浏览和操作。 7. 还可以根据需要,添加其他功能,如放大镜、标注、测量等,来增强遥感影像显示效果。 通过以上步骤,可以在Qt5中实现遥感影像显示。使用QGraphicsView可以方便地实现图像的显示和操作,同时也提供了丰富的功能扩展。这种方式适用于中小型遥感影像显示,如果遥感影像较大,可以考虑使用分块加载和显示的方式来提高性能。 ### 回答2: 遥感影像显示是使用c和qt5编程技术来实现的。遥感影像是通过卫星或其他传感器获取的地球表面的图像数据,可以用于地质勘探、农业、城市规划等领域的分析和研究。在c和qt5中,我们可以使用各种库和函数来读取、处理和显示遥感影像数据。 首先,我们可以使用c语言来读取遥感影像文件,常见的格式有tif、jpeg等。可以使用相关的库函数来读取和解码这些图像文件,获得其图像数据。然后,我们可以使用qt5的绘图函数来显示这些图像数据。可以创建一个窗口,并在窗口中绘制图像数据,实现遥感影像显示。 另外,为了提高遥感影像显示效果和性能,我们还可以在c和qt5中进行一些图像处理的操作。例如,我们可以使用相关的算法来增强图像的对比度、亮度等,以提高图像的可视化效果。我们还可以进行图像的裁剪、缩放等操作,以便更好地展示感兴趣的地区和特征。 最后,为了方便用户对遥感影像进行交互和分析,我们可以使用qt5的用户界面设计工具来创建一些交互控件,以便用户可以进行图像的导航、标注、测量等操作。通过结合c和qt5的编程技术,可以实现一个功能强大、易于使用的遥感影像显示工具。 总结来说,c和qt5是一对强大的编程技术组合,可以用于实现遥感影像的读取、处理和显示。通过使用相关的库函数和绘图函数,结合图像处理算法和用户界面设计,可以创建一个功能丰富、高效的遥感影像显示工具。 ### 回答3: QT是一种跨平台的应用程序开发框架,而Qt5是其最新版本。在遥感影像显示方面,使用QT5可以提供许多功能和特性。首先,QT5提供了丰富的图形界面设计工具,使开发人员可以创建直观、易于使用的界面,并能够显示遥感影像数据。 其次,QT5提供了强大的图像处理功能,可以对遥感影像进行各种操作和处理。例如,可以对影像进行放大、缩小、旋转、裁剪等操作,以满足用户的需求。此外,QT5还支持数据融合和图像增强技术,可以提高遥感影像的质量和清晰度。 另外,QT5还支持与数据库的集成,可以将遥感影像数据存储到数据库中,并实现对影像数据的快速访问和查询。这对于大规模的遥感影像数据处理非常有用。 最后,QT5还提供了可视化和交互功能,使用户能够对遥感影像数据进行可视化分析和交互操作。例如,可以通过鼠标点击、滚动和拖动等方式对影像进行浏览和标注,以便于用户对影像数据进行分析和理解。 综上所述,使用QT5进行遥感影像显示可以提供丰富的功能和特性,使开发人员能够开发出高效、易用的遥感影像显示应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值