很多遥感卫星数据使用的量化级别都要比8bit高,比如常用的WorldView用的是12bit的量化,对于一些图像处理软件,是不能直接处理12bit量化的图像,所以需要将12bit的数据转为16bit数据或者8bit数据来进行处理。

下面写了一个简单的函数来进行处理,具体原理很简单,就是使用GDAL将12bit的数据读进来,然后再使用线性拉伸为8bit存出去,或者直接保存为16bit数据。注意12bit的数据在GDAL中读取的时候会显示为16bit数据,就好比2bit的数据在GDAL中是8bit一样,因为在C或者C++中很难找到一个类型来表示2bit或者12bit的东西,最小的char是8bit,short是16bit。代码如下,首先是头文件:

/***************************************************************************
*
* Time: 2012-02-23
* Project: 遥感平台
* Purpose: 将12bit数据转换为8bit或者16bit
* Author:  李民录
* Copyright (c) 2012, liminlu0314@gmail.com
* Describe:将12bit数据转换为8bit或者16bit
*
****************************************************************************/
#ifndef DATARESCALE_H
#define DATARESCALE_H/*! 8U */
typedef unsigned char   DT_8U;
/*! 16U */
typedef unsigned short  DT_16U;
/**
* @brief 释放数组
*/
#define RELEASE(x)  if(x!=NULL) {delete []x; x = NULL;}/**
* @brief 图像转换,将图像存为16bit,前提确保输入的数据是12bit的
* @param pszSrcFile        输入文件路径
* @param pszDstFile            输出文件路径
* @param bTo8          是否转为8位,false为专为16bit数据,true表示转为8bit数据
* @param pszFormat         输出文件格式,详细参考GDAL支持数据类型
* @return 返回值,表示计算过程中出现的各种错误信息
*/
int ImageDataRescale216(const char* pszSrcFile, const char* pszDstFile, bool bTo8 = true, const char* pszFormat = "GTiff");#endif /* DATARESCALE_H */

下面是函数实现代码:

/***************************************************************************
*
* Time: 2012-02-23
* Project: 遥感平台
* Purpose: 将12bit数据转换为8bit或者16bit
* Author:  李民录
* Copyright (c) 2012, liminlu0314@gmail.com
* Describe:将12bit数据转换为8bit或者16bit
*
****************************************************************************/
#include "DataRescale.h"
#include "gdal_priv.h"/**
* @brief 图像转换,将图像存为16bit,前提确保输入的数据是12bit的
* @param pszSrcFile        输入文件路径
* @param pszDstFile            输出文件路径
* @param bTo8          是否转为8位,false为专为16bit数据,true表示转为8bit数据
* @param pszFormat         输出文件格式,详细参考GDAL支持数据类型
* @return 返回值,表示计算过程中出现的各种错误信息
*/
int ImageDataRescale(const char* pszSrcFile, const char* pszDstFile, bool bTo8 = true, const char* pszFormat = "GTiff")
{//判断输入路径是否为空if(pszSrcFile == NULL || pszDstFile == NULL)return -1;GDALAllRegister();GDALDataset *poSrcDS = (GDALDataset *) GDALOpen( pszSrcFile, GA_ReadOnly );if( poSrcDS == NULL ){//图像打开失败return -2;}GDALDriver *poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);if( poDriver == NULL ){//不能创建制定类型的文件,请检查该文件类型GDAL是否支持创建GDALClose( (GDALDatasetH) poSrcDS );return -3;}//获取图像宽高和波段数int iXSize = poSrcDS->GetRasterXSize();int iYSize = poSrcDS->GetRasterYSize();int iBandCount = poSrcDS->GetRasterCount();//确定输出图像的位数GDALDataType eDT = GDT_UInt16;if(bTo8)eDT = GDT_Byte;elseeDT = GDT_UInt16;//创建16bit的数据GDALDataset *poDstDS = poDriver->Create(pszDstFile, iXSize, iYSize, iBandCount, eDT, NULL);double dGeoTrans[6] = {0};//设置仿射变换参数poSrcDS->GetGeoTransform(dGeoTrans);poDstDS->SetGeoTransform(dGeoTrans);//设置图像投影信息poDstDS->SetProjection(poSrcDS->GetProjectionRef());//用于保存读取的12bit数据DT_16U *pSrcData = new DT_16U[iXSize];if(bTo8) //转换为8bit{//定义结果数据存储空间DT_8U *pDstData = new DT_8U[iXSize];//循环波段for(int iBand=1; iBand<=iBandCount; iBand++){GDALRasterBand *pSrcBand = poSrcDS->GetRasterBand(iBand);GDALRasterBand *pDstBand = poDstDS->GetRasterBand(iBand);for(int i=0; i<iYSize; i++)    //循环图像高{//将数据读出来pSrcBand->RasterIO(GF_Read, 0, i, iXSize, 1, pSrcData, iXSize, 1, GDT_UInt16, 0, 0);//循环,将12bit数据专为8bit数据,使用线性拉伸方式for(int j=0; j<iXSize; j++){double dTemp = pSrcData[j] * 255.0 / 4095.0;if(dTemp > 255.0)pDstData[j] = 255;elsepDstData[j] = (DT_8U)dTemp;}pDstBand->RasterIO(GF_Write, 0, i, iXSize, 1, pDstData, iXSize, 1, GDT_Byte, 0, 0);}}RELEASE(pDstData);    //释放内存}else //转换为16bit数据{//循环波段for(int iBand=1; iBand<=iBandCount; iBand++){GDALRasterBand *pSrcBand = poSrcDS->GetRasterBand(iBand);GDALRasterBand *pDstBand = poDstDS->GetRasterBand(iBand);for(int i=0; i<iYSize; i++)  //循环图像高{//将数据读出来,然后写入结果数据pSrcBand->RasterIO(GF_Read, 0, i, iXSize, 1, pSrcData, iXSize, 1, GDT_UInt16, 0, 0);pDstBand->RasterIO(GF_Write, 0, i, iXSize, 1, pSrcData, iXSize, 1, GDT_UInt16, 0, 0);}}}RELEASE(pSrcData);//关闭原始图像和结果图像GDALClose( (GDALDatasetH) poDstDS );GDALClose( (GDALDatasetH) poSrcDS );return 0;
}

对于上面的实现做一个简单的说明,12bit的数据读进来,对于16bit的直接写到结果图像里面,没有拉伸到16bit的范围,这样就是完全保留了原始数据的所有图像信息,对于保存为8bit的数据,肯定会造成部分信息的丢失,使用最简单的线性方程进行拉伸,将0~4095的范围拉伸到0~255的范围。

转载于:https://www.cnblogs.com/xiaowangba/archive/2012/02/23/6314031.html

使用GDAL将12bit量化图像转为16bit或者8bit相关推荐

  1. QT中使用GDAL多线程读取遥感图像到QImage

    GDAL 是一个很强大的可以读取很多格式 的带有GIS信息的栅格型图像.前阵子项目中需要读取遥感图像,并显示到QT界面,由于遥感图像一般很大,所以采取新开一个读图线程的方式来读取,防止界面假死.下面是 ...

  2. 彩色RGB图像转为灰度图像

    将彩色RGB图像转为灰度图像,其中像素值的转换为 灰度值=0.2989 * R + 0.5870 * G + 0.1140 * B 原彩色RGB图像是三通道的,转换成单通道的灰度图像 自己写了一个Py ...

  3. python输出jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  4. 12bit的图像如何向8bit转化_干货分享 | 如何鉴别Western Blot图像的真实性?

    鉴于在有些已发表的学术论文中,部分Western blot结果被认为存在不正当修饰,产生了诸多负面影响.那么,作为PI,如何才能识别自己实验室的WB图片是否存在不正当修改的情况,或证明完美实验结果的真 ...

  5. python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  6. 将图像转为特征值_用K均值进行图像分割

    个人学习笔记:采用聚类方法对图像进行分割,以下内容纯粹个人理解,如有错误请帮我指出!多谢! 图像分割就是把图像按照某些条件分成不同的区域,并提取出感兴趣的区域.传统的分割方法包括基于阈值的分割.基于区 ...

  7. PaddleWeekly | 量化图像感知相似度,这款工具箱超好用!

    点击左上方蓝字关注我们 开源发展至今,越来越多的开发者使用开源代码的同时,也开始将自己的项目和代码大方骄傲地分享出来,在开源当中找到了成就和价值.更多的开发者得益于开源的优势,从加入使用,到共同开发. ...

  8. 【多尺度注意力的轻量化图像超分辨率】

    MSAR-Net: Multi-scale attention based light-weight image super-resolution (MSAR-Net:基于多尺度注意力的轻量化图像超分 ...

  9. GDAL读取Jpeg2000格式图像

    JPEG-2000标准支持无损和有损压缩,并且支持单图像分量(如灰度图像)和多图像分量(如彩色图像).除了基本的图像压缩功能外,还支持其他的功能:1)对图像进行按精度或者按分辨率来渐进显示.2)感兴趣 ...

最新文章

  1. 我佛了!用KNN实现验证码识别,又 Get 到一招!
  2. 摹客iDoc Sketch插件全新改版!
  3. (0099)iOS开发之Xcode编译工程报错问题汇总
  4. 移动通信网络频段大全,含5G、4G,各种公开频段汇总
  5. STM32F4 HAL库开发 -- STM32CubeMX
  6. 你写的Python代码规范吗?
  7. 互联网的职场红利已经没了
  8. linux 迁移类型,迁移到Linux前必须要知道的五个方面
  9. 物联网技术及应用计算机,物联网的关键技术及计算机物联网的应用
  10. Apache NIFI
  11. 性别分为男子组和女子组
  12. re模块day17课堂小结
  13. 将VC++黑白屏蔽图转换为Cocos2dx中可用的png
  14. 十四、 ThinkPHP6_聚合.原生.子查询
  15. 2021年危险化学品经营单位安全管理人员考试题及危险化学品经营单位安全管理人员证考试
  16. frame框架初步解析
  17. 二进制全加器(只涉及一位加法)逻辑图和电路图
  18. 计算机毕业设计SSM大学生就业分析系统【附源码数据库】
  19. SSL证书默认保护www和不带www?
  20. android添加新语言之缅甸语

热门文章

  1. 前沿|Google AI提新型神经网络,对神经元进行高精度自动重建
  2. 一张图看懂微软人工智能
  3. IDC Future Scape : 2018年全球物联网十大趋势性预测,5G将加速IoT发展
  4. 腾讯员工人均年薪84.7万,马化腾:员工心理健康最重要
  5. 没有特斯拉的 3·15 都曝了些什么?
  6. 钉钉 6.0 盯上应用开发
  7. MIIC:互联网会成基础设施,智能硬件就是互联网硬件
  8. 三星为何要在安卓之外开发 Tizen 系统?
  9. 折腾Java设计模式之责任链模式
  10. do_exit——exit_notify()【转】