arcgis加载图像显示像素值为浮点型导致无法正常转换图像位数(16bit转8bit)

情况如下:
在这里插入图片描述
这张16bit的图像素值都是浮点型的,无论是用arcgis还是代码直接转8bit会出现空白或者全黑的结果,需要先转无符号的16bit再转8bit才能正常显示

# -*- coding: utf-8 -*-
from osgeo import ogr
from osgeo import gdal
from gdalconst import *
import os, sys, time
import numpy as np
np.seterr(divide='ignore',invalid='ignore')

def read_img(filename):
    dataset=gdal.Open(filename)

    im_width = dataset.RasterXSize
    im_height = dataset.RasterYSize

    im_geotrans = dataset.GetGeoTransform()
    im_proj = dataset.GetProjection()

    # band1 = dataset.GetRasterBand(1)
    # band2 = dataset.GetRasterBand(2)
    # band3 = dataset.GetRasterBand(3)
    # band4 = dataset.GetRasterBand(4)
    # band1.SetNoDataValue(0)
    # band2.SetNoDataValue(0)
    # band3.SetNoDataValue(0)
    # band4.SetNoDataValue(0)

    im_data = dataset.ReadAsArray(0,0,im_width,im_height)

    del dataset 
    return im_proj,im_geotrans,im_width, im_height,im_data


def write_img(filename, im_proj, im_geotrans, im_data):
    if 'int8' in im_data.dtype.name:
        datatype = gdal.GDT_Byte
    elif 'int16' in im_data.dtype.name:
        datatype = gdal.GDT_UInt16
    else:
        datatype = gdal.GDT_Float32

    if len(im_data.shape) == 3:
        im_bands, im_height, im_width = im_data.shape
    else:
        im_bands, (im_height, im_width) = 1,im_data.shape 

    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(filename, im_width, im_height, im_bands, gdal.GDT_UInt16)

    dataset.SetGeoTransform(im_geotrans)
    dataset.SetProjection(im_proj)

    if im_bands == 1:
        dataset.GetRasterBand(1).WriteArray(im_data)
    else:
        for i in range(im_bands):
            dataset.GetRasterBand(i+1).WriteArray(im_data[i])

    del dataset

#拉伸
def stretch_n(bands, img_min, img_max, lower_percent=2, higher_percent=98):
    out = np.zeros_like(bands).astype(np.float32)
    a = img_min
    b = img_max
    c = np.percentile(bands[:, :], lower_percent)
    d = np.percentile(bands[:, :], higher_percent)
    t = a + (bands[:, :] - c) * (b - a) / (d - c)
    t[t < a] = a
    t[t > b] = b
    out[:, :] = t
    return out


if __name__ == "__main__":
    in_path = "E:/hz/hz_autumn.tif"
    out_path = "E:/hz/hz_autumn_int.tif"

    im_proj,im_geotrans,im_width, im_height,im_data = read_img(in_path)
    # temp = im_data[0] + im_data[1] + im_data[2] + im_data[3]
    #temp = im_data[0]
    # temp[temp>0] = 1
    # im = im_data[0]
    # temp = stretch_n(temp, 0, 255)
    # im = np.uint8(im)
    write_img(out_path, im_proj, im_geotrans, temp)

注意这里 dataset = driver.Create(filename, im_width, im_height, im_bands, gdal.GDT_UInt16)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如雾如电

随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值