精华内容
下载资源
问答
  • 利用GDAL和numpy实现影像uint16uint8的转换, 支持整图转换和切图转换,高效率转换并保存为tif格式、png格式 优点:简单高效,代码逻辑相对简单 缺点:使用numpy数组计算,超级耗内存 实现逻辑: 使用percentile...

    利用GDAL和numpy实现影像uint16到uint8的转换,
    支持整图转换和切图转换,高效率转换并保存为tif格式、png格式

    优点:简单高效,代码逻辑相对简单
    缺点:使用numpy数组计算,超级耗内存

    实现逻辑:

    1. 使用percentile计算每个波段的直方图的2%、98%的值
    2. 小于2%的值赋值为2%的值,大于98%的值赋值为98%的值
    3. 将数组拉伸到0-255
    
    from PIL import Image
    from osgeo import gdal
    import numpy as np
    
    
    def get_stretch_scale(array):
        """计算2%、98%的值"""
        per2 = np.percentile(array, 2)
        per98 = np.percentile(array, 98)
        # 最小值,最大值映射到0-255
        return per2, per98, (per98 - per2) / 255
    
    
    def read_tif():
        """读取tif数据"""
        _ds: gdal.Dataset = gdal.Open(tif)
        _prj = _ds.GetProjection()
        _transform = _ds.GetGeoTransform()
        return _ds, _prj, _transform
    
    
    def save_to_tif(array):
        """保存为tif"""
        _, rows, cols = array.shape
        tif_driver: gdal.Driver = gdal.GetDriverByName('GTiff')
        tif_ds: gdal.Dataset = tif_driver.Create(out_tif, cols, rows, 3, gdal.GDT_Byte)
        # 设置投影和坐标信息
        tif_ds.SetProjection(prj)
        tif_ds.SetGeoTransform(transform)
    	# 获取波段
        b1: gdal.Band = tif_ds.GetRasterBand(1)
        b2: gdal.Band = tif_ds.GetRasterBand(2)
        b3: gdal.Band = tif_ds.GetRasterBand(3)
        # 设置无效值
        b1.SetNoDataValue(0)
        b2.SetNoDataValue(0)
        b3.SetNoDataValue(0)
    	# 写入数据
        b1.WriteArray(array[0])
        b2.WriteArray(array[1])
        b3.WriteArray(array[2])
    
    
    def save_to_png(array):
        """保存为png"""
    	
    	# 反转数组为Image支持的格式 
        array = np.rollaxis(array[:3], 0, 3)
        img = Image.fromarray(array)
    
        # 添加alpha波段
        alpha = img.split()[0]
        mask = Image.eval(alpha, lambda a: 0 if a == 0 else 255)
        img.putalpha(mask)
    
        # 保存为PNG
        img.save(out_png)
    
        # 下面两行转为PNG8
        # img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE)
        # img.save(png_path, transparency=255)
    
    
    def uint16_to_uint8():
        # array = ds.ReadAsArray(xoff=1300, yoff=1000, xsize=512, ysize=512, buf_xsize=256, buf_ysize=256)
        array = ds.ReadAsArray()
        # 只需要前三个波段
        array = array[:3]
    
        if array.dtype == 'uint16' or array.dtype == 'int16':
            for i in range(3):
                per2, per98, scale = get_stretch_scale(ds.GetRasterBand(i + 1).ReadAsArray())
                i_array = array[i]
                i_array[i_array < per2] = per2
                i_array[i_array > per98] = per98
                # 数组拉伸
                array[i] = (i_array - per2) / scale
            # 转为uint8
            array = np.uint8(array)
            # 波段反转,bgr-->rgb
            array = array[::-1]
    
        save_to_tif(array)
    
        save_to_png(array)
    
    
    if __name__ == '__main__':
        import time
    
        s = time.time()
    
        tif = r'E:\数据\GF20190126\gf2.tif'
        out_tif = r'E:\数据\GF20190126\out.tif'
        out_png = r'E:\数据\GF20190126\out.png'
    
        ds, prj, transform = read_tif()
    
        uint16_to_uint8()
    
        t = time.time()
        print(t - s, '秒')
    
    
    展开全文
  • matlab将uint16转换成uint8的方法

    万次阅读 2019-01-04 10:00:15
    将一个16位(0~65535)的图像Image...(1)uint8(Image) : 将超过255的shuz数值直接设为255 (2)uint8(double(Image)/65535*255):将0-65535的灰度级映射到0-255的灰度级范围 (3)im2uint8(Image) : 同 (2)...

    将一个16位(0~65535)的图像Image转换成8位(0~255),有几种方法:

    (1)uint8(Image) : 将超过255的shuz数值直接设为255

    (2)uint8(double(Image)/65535*255):将0-65535的灰度级映射到0-255的灰度级范围

    (3)im2uint8(Image) :  同 (2)

    展开全文
  • uint8_t p = (val>>24)&0xFF; vec.push_back(p); p = (val>>16)&0xFF; vec.push_back(p); p = (val>>8)&0xFF; vec.push_back(p); p = (val&0xFF); vec.push_back(p); } else { // unsigned char* p = (unsigned ...

    appendUint32ToVec(std::vector & vec, unsigned int val, bool bigEndian )

    {

    if (bigEndian)

    {

    // unsigned char* p = (unsigned char*) &val;

    // p += 3;

    // vec.push_back(*p--);

    // vec.push_back(*p--);

    // vec.push_back(*p--);

    // vec.push_back(*p);

    uint8_t p = (val>>24)&0xFF;

    vec.push_back(p);

    p = (val>>16)&0xFF;

    vec.push_back(p);

    p = (val>>8)&0xFF;

    vec.push_back(p);

    p = (val&0xFF);

    vec.push_back(p);

    }

    else

    {

    // unsigned char* p = (unsigned char*) &val;

    // vec.push_back(*p++);

    // vec.push_back(*p++);

    // vec.push_back(*p++);

    // vec.push_back(*p++);

    uint8_t p = (val&0xFF);

    vec.push_back(p);

    p = (val>>8)&0xFF;

    vec.push_back(p);

    p = (val>>16)&0xFF;

    vec.push_back(p);

    p = (val>>24)&0xFF;

    vec.push_back(p);

    }

    }

    appendUint16ToVec(std::vector & vec, unsigned short val, bool bigEndian )

    {

    if (bigEndian)

    {

    // unsigned char* p = (unsigned char*) &val;

    // p += 1;

    // vec.push_back(*p--);

    // vec.push_back(*p);

    vec.push_back((val>>8)&0xFF);

    vec.push_back(val&0xFF);

    }

    else

    {

    // unsigned char* p = (unsigned char*) &val;

    // vec.push_back(*p++);

    // vec.push_back(*p++);

    vec.push_back(val&0xFF);

    vec.push_back((val>>8)&0xFF);

    }

    }

    appendFloadToVec(std::vector & vec, float val, bool bigEndian)

    {

    if (bigEndian)

    {

    unsigned char* p = (unsigned char*) &val;

    p+= 3;

    vec.push_back(*p--);

    vec.push_back(*p--);

    vec.push_back(*p--);

    vec.push_back(*p);

    }

    else

    {

    unsigned char* p = (unsigned char*) &val;

    vec.push_back(*p++);

    vec.push_back(*p++);

    vec.push_back(*p++);

    vec.push_back(*p++);

    }

    }

    float 也可以用结构体形式

    展开全文
  • C++ 中 uint8_t,uint16_t相互转换 uint8_t src_data[10] = {0, 1, 2, 3, 4, 5...//1.uint8_t转uint16_t for (int i = 0; i < 5; i++) { dec_data[i] = src_data[i * 2] | (src_data[i * 2 + 1] << 8); ...

    C++ 中 uint8_t,uint16_t,uint64_t相互转换


    uint8_t src_data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    uint16_t dec_data[5];
    uint8_t nsrc_data[10];
    //1.uint8_t转uint16_t
    for (int i = 0; i < 5; i++) {
        dec_data[i] = src_data[i * 2] | (src_data[i * 2 + 1] << 8);
        //%hu
        LOGI("dec_data :%hu", dec_data[i]);
    }
    //1.uint16_t转uint8_t
    for (int i = 0; i < 5; i++) {
        nsrc_data[i * 2] = dec_data[i];
        nsrc_data[i * 2 + 1] = dec_data[i] >> 8;
         //%c
        LOGI("dec_data1 :%d dec_data2 :%d", nsrc_data[i * 2], nsrc_data[i * 2 + 1]);
    }

    //3.uint16_t转uint64_t

    uint8_t src_data[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
    uint64_t dec_data[3];
    uint8_t nsrc_data[12];
    for (int i = 0; i < 3; i++) {
        dec_data[i] = src_data[i * 4]
                      | (src_data[i * 4 + 1] << 8)
                      | (src_data[i * 4 + 2] << 16)
                      | (src_data[i * 4 + 3] << 24);
        //%hu
        LOGI("dec_data :%hu", dec_data[i]);
    }
    //4.uint64_t转uint8_t
    for (int i = 0; i < 3; i++) {
        nsrc_data[i * 4] = dec_data[i];
        nsrc_data[i * 4 + 1] = dec_data[i] >> 8;
        nsrc_data[i * 4 + 2] = dec_data[i] >> 16;
        nsrc_data[i * 4 + 3] = dec_data[i] >> 24;
        //%c
        LOGI("dec_data1 :%d dec_data2 :%d", nsrc_data[i * 4], nsrc_data[i * 4 + 1]);
        LOGI("dec_data1 :%d dec_data2 :%d", nsrc_data[i * 4 + 2], nsrc_data[i * 4 + 3]);
    }
    展开全文
  • 在我想着去寻找uint8/uint16/float32数据类型的区别前,我已经花了两天的时间在代码调试上。说来也不长,就几百行的代码,我瞅了两天,硬是没看到错在哪里。。。 毕竟,能写下这个题目的时候,我已经是知道了问题出...
  • 我们在该文中已经分析了关于字符指针强制类型转换为uint16_t/uint8_t型指针,不会越限的现象,这里我们做一下具体分析: char ch[4]={0xAA,0x11}; printf("%d %d\n",*ch,*(ch+1)); printf("%x %x\n",*ch,*(ch+1...
  • Swift [UInt8]转16进制字符串

    千次阅读 2019-08-08 15:26:34
    [UInt8]转16进制字符串 使用String的format方法,把UInt8转成hex,使用02表示2位,不足补0。 extension Array where Element == UInt8 { var hexString: String { return self.compactMap { String(format: "%02x...
  • 比如 unit16_t*转换成char*的形式: unit16_t*-------->char*:指向双字节的指针------>指向单字节的指针,大小会丢位; char*-------->unit16_t*:指向单字节的指针------>指向双字节的指针,小大...
  • char、unsigned char、uint8_t、uint16_t

    千次阅读 2020-03-10 11:05:07
    文章目录char、unsigned char、uint8_t、uint16_t概述NSStringuint8_t、uint16_t取值范围初探charint取值范围的计算方法sizeof()一些系统的宏推荐阅读 char、unsigned char、uint8_t、uint16_t 概述 基础 在C/...
  • 作为uint16_t类型的小端的值1存储如下,其中a0是低于a1的地址...a0 a1|10000000|00000000注意,最低有效字节是第一个,但是当我们以十六进制打印它时,右边出现最低有效字节,这是我们通常在任何机器上所期望的。...
  • 自...uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型?这些数据类型是 C99 中定义的,具体定义在:/usr/include/stdint.h ISO C99: 7.18 Integer types <stdint.h> /* T...
  • 【ReactNative/JS】uint8arraystring convert uint8array to string 标签: uint8arraystringconvert转换uint16 2016-07-22 00:50 1263人阅读 评论(0) 收藏 举报  分类: 【ReactNative】(6) ...
  • /*uint8 无符号一个字节 Int16 有符号 两个字节 Uint16 无符号两个字节 Int32 有符号4字节 Float4字节,正字节 */ //无符号数据转换,一个字节 public static int Uint8ToInt1W(byte byt) ...
  • 在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样的疑问。论坛上就有人问...
  • 在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样的疑问。论坛上就有人问...
  • 一、uint8_t转uint32_t uint8_t var1 = 0x12; uint8_t var2 = 0x34; uint8_t var3 = 0x56; uint8_t var3 = 0x78; uint32_t bigvar = (var3 <... 16) + (var2 <...二、uint32_t转uint8_t uint8_t p[4]; uint
  • uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据...
  • 最近项目中要用到socket通讯,由于涉及到组包问题,所以需要数据类型之间的...1. int类型转16进制hexstring //int 转16进制 - (NSString *)hexFromInt:(NSInteger)val { return [NSString stringWithFormat:@"%X"...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 608
精华内容 243
关键字:

uint16转uint8