遥感影像16位转8位(python)-矩阵运算,速度提升

**

说明:

**
1、本文是基于网页:https://blog.csdn.net/u014311125/article/details/93746867
的基础上进行代码优化的,原理未变,只加快了运算速度。
2、当我用这段代码跑64位深的图片的时候,根本计算不出来,经过代码分析主要原因为里面的几个for循环,当图像太大(千万甚至上亿的运算量)的时候根本无法计算。
3、本人花了一天时间优化了代码,运用pandas数组运算,得到的结果是一样,但是效率提升了n多倍。
**

测试效果及以后优化方向

**
1、用博主提供的图片进行测试,测试效果与博主的转换结果效果是完全等同;
2、试着用一个64位深的图片放进去转换速度也很快,但是颜色变了,里面原理可能需要再修改以下。
3、下一步可以按此思路进行更深度的图片转换,下面废话不多说,抛上我的代码。

#!usr/bin/env python
# -*- coding: utf-8 -*-

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

import gdal
import os
import glob
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cv2


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

    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, 3


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

#改编代码如下四行实现
        temp=np.array(array_data[i, :, :])
        temp[temp>cutmax]=cutmax
        temp[temp= 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__':
    # origin_16 = "./datas/mulObject/GF1_PMS1_E128.9_N35.0_20190127_L1A0003796627-MSS1-recitfy.tiff"
    origin_16 = "./datas/test16to8/in/20190630112555233.png"
    output_8 = "./datas/test16to8/out/gj2.tif"
    compress(origin_16, output_8)

你可能感兴趣的:(遥感,python,遥感图像压缩)