现在常用卫星影像基本上都是16位影像,如GF,ZY3,Landsat8,WV等,有时我们需要将16位影像降到8位影像,这样不仅减小了数据量,也便于后期处理。

通常的软件在处理降位时会存在一些问题,如曝光,出现空值等。因此,我自己根据常用的降位方法,如最简单的线性拉伸,分段拉伸以及对数变换和指数变换,结合常用影像的特点,使用百分比截断和指数(幂为0.7)变换将影像从16位降到8位,在抑制高光的同时保证了影像的对比度。

 int imageprocessing::stretch_percent_16to8(const char *inFilename, const char *dstFilename){GDALAllRegister();//为了支持中文路径CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");int src_height = 0; int src_width = 0;GDALDataset *poIn = (GDALDataset *)GDALOpen(inFilename,GA_ReadOnly);   //打开影像//获取影像大小src_width = poIn ->GetRasterXSize();src_height = poIn ->GetRasterYSize();//获取影像波段数int InBands = poIn ->GetRasterCount();//获取影像格式GDALDataType eDataType = poIn -> GetRasterBand(1) -> GetRasterDataType();//定义存储影像的空间参考数组double adfInGeoTransform[6] = {0};const char *pszWKT = NULL;//获取影像空间参考poIn ->GetGeoTransform(adfInGeoTransform);pszWKT = poIn ->GetProjectionRef();//创建文件GDALDriver *poDriver = (GDALDriver *)GDALGetDriverByName("GTiff");GDALDataset *poOutputDS = poDriver -> Create(dstFilename,src_width,src_height,InBands,GDT_Byte,NULL);//设置拉伸后图像的空间参考以及地理坐标poOutputDS -> SetGeoTransform(adfInGeoTransform);poOutputDS -> SetProjection(pszWKT);//读取影像cout<<"16位影像降到8位影像处理..."<<endl;for(int iBand = 0; iBand < InBands; iBand++ ){cout<<"正在处理第 "<<iBand + 1<<" 波段"<<endl;//读取影像uint16_t *srcData = (uint16_t *)malloc(sizeof(uint16_t) *src_width * src_height *1);memset(srcData,0,sizeof(uint16_t ) * 1 *src_width * src_height);int src_max = 0, src_min = 65500;//读取多光谱影像到缓存poIn ->GetRasterBand( iBand + 1) -> RasterIO( GF_Read, 0, 0, src_width, src_height , srcData + 0 * src_width * src_height,src_width,src_height, GDT_UInt16, 0, 0 );//}//统计最大值for (int src_row = 0; src_row < src_height; src_row ++){for (int src_col = 0; src_col < src_width; src_col++){uint16_t src_temVal = *(srcData + src_row * src_width + src_col);if (src_temVal > src_max)src_max = src_temVal;if(src_temVal < src_min )src_min = src_temVal;}}double *numb_pix = (double *)malloc(sizeof(double)*(src_max+1));      //存像素值直方图,即每个像素值的个数memset(numb_pix,0,sizeof(double) * (src_max+1));//                 -------  统计像素值直方图  ------------         //for (int src_row = 0; src_row < src_height; src_row ++){for (int src_col = 0; src_col < src_width; src_col++){uint16_t src_temVal = *(srcData + src_row * src_width + src_col);*(numb_pix + src_temVal) += 1;}}double *frequency_val = (double *)malloc(sizeof(double)*(src_max+1));           //像素值出现的频率memset(frequency_val,0.0,sizeof(double)*(src_max+1));for (int val_i = 0; val_i <= src_max; val_i++){*(frequency_val + val_i) = *(numb_pix + val_i) / double(src_width * src_height);}double *accumlt_frequency_val = (double*)malloc(sizeof(double)*(src_max+1));   //像素出现的累计频率memset(accumlt_frequency_val, 0.0,sizeof(double)*(src_max+1));for (int val_i = 0; val_i <= src_max; val_i ++){for (int val_j = 0; val_j < val_i; val_j ++ ){*(accumlt_frequency_val + val_i) += *(frequency_val + val_j);}}//统计像素两端截断值int minVal = 0, maxVal = 0;for (int val_i = 1; val_i < src_max; val_i++){double acc_fre_temVal0 = *(frequency_val + 0);double acc_fre_temVal = *(accumlt_frequency_val + val_i);if((acc_fre_temVal - acc_fre_temVal0) > 0.0015 ){    minVal = val_i;break;  }}for (int val_i = src_max-1; val_i > 0; val_i--){double acc_fre_temVal0 = *(accumlt_frequency_val + src_max);double acc_fre_temVal = *(accumlt_frequency_val + val_i);if(acc_fre_temVal < (acc_fre_temVal0 - 0.00012) ){    maxVal = val_i;break;  }}for (int src_row = 0; src_row < src_height; src_row ++){uint8_t *dstData = (uint8_t*)malloc(sizeof(uint8_t)*src_width);memset(dstData, 0, sizeof(uint8_t)*src_width);for (int src_col = 0; src_col < src_width; src_col++){uint16_t src_temVal = *(srcData + src_row * src_width + src_col);double stre_temVal = (src_temVal - minVal) / double(maxVal - minVal) ;if(src_temVal < minVal){*(dstData + src_col) = (src_temVal) *(20.0/double(minVal)) ;}else if(src_temVal > maxVal){ stre_temVal = (src_temVal - src_min) / double(src_max - src_min);*(dstData + src_col) = 254; }else*(dstData + src_col) = pow(stre_temVal,0.7) * 250;}poOutputDS->GetRasterBand(iBand + 1)->RasterIO(GF_Write, 0,src_row,src_width,1,dstData,src_width,1,GDT_Byte,0,0);free(dstData);}free(numb_pix);free(frequency_val);free(accumlt_frequency_val);free(srcData);}GDALClose(poIn);GDALClose(poOutputDS);return 0;}

遥感影像16位转8位相关推荐

  1. 7.某计算机的控制器采用微程序控制方式,微指令中的操作控制字段的16位采用混合表示法,其中用11位采用直接表示法,另外5位分为3位和2位的编码表示法,则此格式的微指令最多可表示多少个微指令?

    7.某计算机的控制器采用微程序控制方式,微指令中的操作控制字段的16位采用混合表示法,其中用11位采用直接表示法,另外5位分为3位和2位的编码表示法,则此格式的微指令最多可表示多少个微指令? 解: - ...

  2. admin密码对应的MD5值,16位和32位,admin解密自己留着方便.

    admin密码对应的MD5值,16位和32位,自己留着方便.admin的md5值是多少,常用密码加密md5值,123456,admin,admin888 如果遇到MD5加密文件(一般都是这个),而又不 ...

  3. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  4. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  5. node 16位 转24位_C代码实现16位和32位数据字节序转换

    点击上方公众号名称关注,获得更多内容 ✎ 编 者 悟 语 每天给自己一个存在的意识,这样才会有一颗认真的心. 文 章 导 读 今天给大家用C代码实现下大小端字节序的转换代码,感谢的小伙伴可以拿下来撸一 ...

  6. 16位转8位 winhex_64位系统究竟强在哪里?

    想必大家都遇到过这样的问题:安装某个软件的时候,出现提示选择32位版本还是64位版本?我们也可以查看自己的电脑是32位还是64位系统. Windows Linux 大家可能知道32位和64位和系统有关 ...

  7. 16位和32位微处理器(3)——Pentium的先进技术

    先进的体系结构 (1)内部总线(CPU内部的)32(64)位,外部数据总线(CPU与外设)64位 (2)片内代码Cache,数据Cache(缓冲,加快取指令和读写速度) (3)两条指令流水线并行(减小 ...

  8. 从16位到32位再到64位,为何16年过去,依然没有128位系统出现?

    绝大部分人都没有意识到128位的处理器早已经存在了,并且已经存在了几十年.这么多年过去了,不光是128位的处理器出现了,256位.512位的处理器也同样出现了,比如Nvidia GTX 280这样的显 ...

  9. C语⾔:8位、16位、32位数据转换

    C语⾔:8位.16位.32位数据转换 8位转16位 将2个8位数据u8_high.u8_low合成⼀个16位数据u16_data: u16_data=(u8_high<<8)| u8_lo ...

最新文章

  1. 网站建设想要出类拔萃还要从基础上做创新
  2. Spring和Mybatis集成,如何批量insert update?以及一些通用Dao的设想
  3. 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码
  4. 《C语言点滴》一1.5 内功修炼
  5. linux管理员常用的命令分享
  6. 一分钟了解四层/七层反向代理
  7. CVPR 2021 论文开放下载了!
  8. 不规则动词的一般过去时
  9. linux fortran 内存不足,内存不够不用怕! 虚拟内存不足的十种解决办法
  10. orderquery.php,multiOrderQuery.php
  11. 使用Cygwin登录Raspberry PI
  12. 清除Linux和window等系统的DNS缓存的命令
  13. Sea Battle<海战>(思路题)
  14. 如何在Inceptor中使用日期函数获取与转换时间
  15. 程序员 数学_程序员数学课程
  16. transcad安装教程_北京道亨线路软件SLCAD3.0
  17. ubantu无法连接外网的解决方法
  18. python windows开发环境_windows10下搭建Python3.6开发环境
  19. Windows Docker Desktop 无法启动报错 Docker Desktop is shutting down 的可能解决办法
  20. 远程办公新常态,为什么需要“零信任”模式?

热门文章

  1. SequoiaDB数据库搭建Spark
  2. 移动原生App开发和HTML 5开发,你更看好哪个?
  3. oracle dcd设置,Oracle DCD配置缓解12170问题
  4. java xsd 生成类_xsd 生成 java类
  5. JavaWeb项目:新闻发布系统02(新闻系统功能制作)
  6. 用Python将word文件转换成html
  7. 系统平台关键词怎么补?具体操作思路
  8. 淘宝分布式数据层TDDL
  9. 电脑开机没反应,怎么解决?
  10. K-均值聚类学习思考