首页 > 其他分享 >将16位遥感图像压缩至8位,并保持色彩一致

将16位遥感图像压缩至8位,并保持色彩一致

时间:2022-11-21 19:36:43浏览次数:51  
标签:rows band 16 cols dataset 图像压缩 遥感 array data

 

"""
将16位遥感图像压缩至8位,并保持色彩一致
"""
from osgeo import gdal
import os
import glob
import numpy as np
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片


def read_tiff(input_file):
    """
    读取影像
    :param input_file:输入影像
    :return:波段数据,仿射变换参数,投影信息、行数、列数、波段数
    """
    print("**********",input_file)


    dataset = gdal.Open(input_file)
    rows = dataset.RasterYSize
    cols = dataset.RasterXSize

    geo = dataset.GetGeoTransform()
    proj = dataset.GetProjection()

    couts = dataset.RasterCount

    array_data = np.zeros((couts, rows, cols))

    for i in range(couts):
        band = dataset.GetRasterBand(i + 1)
        array_data[i, :, :] = band.ReadAsArray()

    return array_data, geo, proj, rows, cols, 1


def compress(origin_16, output_8):
    array_data, geo, proj, rows, cols, couts = read_tiff(origin_16)

    compress_data = np.zeros((couts, rows, cols))

    for i in range(couts):
        band_max = np.max(array_data[i, :, :])
        band_min = np.min(array_data[i, :, :])

        cutmin, cutmax = cumulativehistogram(array_data[i, :, :], rows, cols, band_min, band_max)

        compress_scale = (cutmax - cutmin) / 255

        for j in range(rows):
            for k in range(cols):
                if (array_data[i, j, k] < cutmin):
                    array_data[i, j, k] = cutmin

                if (array_data[i, j, k] > cutmax):
                    array_data[i, j, k] = cutmax

                compress_data[i, j, k] = (array_data[i, j, k] - cutmin) / compress_scale

    write_tiff(output_8, compress_data, rows, cols, couts, geo, proj)


def write_tiff(output_file, array_data, rows, cols, counts, geo, proj):
    Driver = gdal.GetDriverByName("Gtiff")
    dataset = Driver.Create(output_file, cols, rows, counts, gdal.GDT_Byte)

    dataset.SetGeoTransform(geo)
    dataset.SetProjection(proj)

    for i in range(counts):
        band = dataset.GetRasterBand(i + 1)
        band.WriteArray(array_data[i, :, :])


def cumulativehistogram(array_data, rows, cols, band_min, band_max):
    """
    累计直方图统计
    """

    # 逐波段统计最值

    gray_level = int(band_max - band_min + 1)
    gray_array = np.zeros(gray_level)

    counts = 0
    for row in range(rows):
        for col in range(cols):
            gray_array[int(array_data[row, col] - band_min)] += 1
            counts += 1

    count_percent2 = counts * 0.02
    count_percent98 = counts * 0.98

    cutmax = 0
    cutmin = 0

    for i in range(1, gray_level):
        gray_array[i] += gray_array[i - 1]
        if (gray_array[i] >= count_percent2 and gray_array[i - 1] <= count_percent2):
            cutmin = i + band_min

        if (gray_array[i] >= count_percent98 and gray_array[i - 1] <= count_percent98):
            cutmax = i + band_min

    return cutmin, cutmax


if __name__ == '__main__':
    input_path = r"D:\test"

    classs = os.listdir(input_path)
    i=0
    for folder in classs:
        folderall = os.path.join(input_path, folder)
        # print(folderall)
        # lena = mpimg.imread(folderall)
        # lena.shape
        # plt.imshow(lena)  # 显示图片
        # plt.axis('off')  # 不显示坐标轴
        # plt.show()
        # break
        output_8 = r'D:\test\out{}.tif'.format(i)
        compress(folderall, output_8)
        i=i+1

 

标签:rows,band,16,cols,dataset,图像压缩,遥感,array,data
From: https://www.cnblogs.com/suoyike1001/p/16912928.html

相关文章

  • 遥感影像自适应降位拉伸(16_8)
    importosimportsysimportglobfromosgeoimportgdalimportnumpyasnpimportcv2defCalHistogram(img):img_dtype=img.dtypeimg_hist=img.res......
  • 1688商品详情API接口,1688商品详情API接口接入说明
    为了进行此平台API的调用,首先我们需要做下面几件事情。1、获取一个KEY。2、参考API文档里的接入方式和示例。3、查看测试工具是否有需要的接口,响应实例的返回字段是否符合......
  • java对接新中新电子:QKQ-A16Q (一)
    1.新中新电子:QKQ-A16Q    参考资料:新中新电子官网:http://www.synjones.com/service.html#part_oneUSB:\验证_USB_V1.2 ......
  • java对接新中新电子:QKQ-A16Q (一)
    1.新中新电子:QKQ-A16Q    参考资料:新中新电子官网:http://www.synjones.com/service.html#part_oneUSB:\验证_USB_V1.2 ......
  • java对接新中新电子:QKQ-A16Q (一)
    1.新中新电子:QKQ-A16Q    参考资料:新中新电子官网:http://www.synjones.com/service.html#part_oneUSB:\验证_USB_V1.2 ......
  • 【2022-11-16】踏实可见
    08:00公主不是天生的,公主的光芒是自己赢来的。公主为自己而战,为热爱而战。                             ......
  • NB-IoT天线同轴电缆RG316、RG174、RG178
    NB-IoT的天线电缆可以接多长?常用的线缆有RG316、RG174、RG178,不同的线缆其衰减程度如何?|型号|阻抗(ohms)|内芯(mm)|内绝缘|外绝缘|外径(mm)|衰减(dB)|内芯导体|屏蔽层导体||—|---|......
  • CF167E
    题意:给你一个有向无环图,其中没有入度的点为源点,没有出度的点为汇点。(保证源汇点数目相同)考虑将源汇点两两匹配,用互不相交的路径将匹配的点对两两连接的所有方案。将匹配......
  • Windows server 2016 安装oracle的教程图解
    这篇文章主要介绍了Windowsserver2016安装oracle的教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 1.安装oracleOracle的......
  • windows server2016安装oracle 11g的图文教程
    Windows Server是微软面向服务器的操作系统,服务器操作系统和客户端操作系统是不一样的,下面这篇文章主要给大家介绍了关于windows server2016安装oracle 11g的相关资料......