如何利用Python对遥感影像进行显示

19 篇文章 23 订阅

遥感影像一般具有多个波段,比较常见的影像一般是4波段多光谱影像,比如高分一号、高分二号、资源三号等。

这些影像数据一般体量较大,有的几百兆,有的多达几十G,格式一般是16位无符号整型,一般看图软件无法打开显示,需要ArcGIS、ENVI等专业的软件进行查看,有时候很不方便。

这篇博客就简单的介绍一下,如何利用Python对遥感影像进行显示,需要用到的库为GDAL和Opencv。

正文

Python中,一般的绘图库都无法处理或显示遥感影像,例如Matplotlib、Opencv、Scipy等,很多连遥感影像都读取不了。

基于此,本代码的主要解决思路:(1)利用GDAL读取遥感影像,获取影像数据;(2)对影像数据进行简单的拉伸变换处理,处理成8位整型;(3)将处理后的数据显示出来。附带增加了一个Gamma变换函数,可以对数据进行拉伸处理。

测试数据:高分一号8米4波段多光谱数据

这里,遥感影像的读取函数,来源于之前写的博客 如何使用Python中的GDAL库对遥感影像进行读取和存储。

# -*- coding: utf-8 -*-
import numpy as np
from osgeo import gdal
import cv2

class IMAGE:
    #读图像文件
    def read_img(self, filename):
        dataset = gdal.Open(filename) #打开文件
        im_width = dataset.RasterXSize  #栅格矩阵的列数
        im_height = dataset.RasterYSize  #栅格矩阵的行数
        im_bands = dataset.RasterCount   #波段数
        im_geotrans = dataset.GetGeoTransform()  #仿射矩阵,左上角像素的大地坐标和像素分辨率
        im_proj = dataset.GetProjection() #地图投影信息,字符串表示
        im_data = dataset.ReadAsArray(0,0,im_width,im_height)
 
        del dataset 
 
        return im_bands, im_data
 
    #写GeoTiff文件
    def write_img(self, 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, datatype)
 
        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 img_processing(im_band,img_data):
    if im_band == 1:
        data_jpg = np.zeros((img_data.shape[0],img_data.shape[1]),dtype='uint8')
        im_max = np.amax(img_data)
        im_min = np.amin(img_data)
        for m in range(0, img_data.shape[0]):
            for n in range(0, img_data.shape[1]):
                data_jpg[m,n] = float(255./(im_max-im_min))*(img_data[m,n]-im_min)
    else:
        data_jpg = np.zeros((img_data.shape[1],img_data.shape[2],3),dtype='uint8')
        for i in range(3):
            im_max = np.amax(img_data[i,:,:])
            im_min = np.amin(img_data[i,:,:])
            for m in range(0, img_data.shape[1]):
                for n in range(0, img_data.shape[2]):
                    data_jpg[m,n,i] = float(255./(im_max-im_min))*(img_data[i,m,n]-im_min)
    return data_jpg

## GAMMA 变换 ##
def gamma_trans(img, gamma):
    gamma_table = [np.power(x/255.0,gamma)*255.0 for x in range(256)]
    gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)
    return cv2.LUT(img,gamma_table)

if __name__ == '__main__':
    image_grid = IMAGE()
    image_name = 'GF1.tif'
    im_band,img_data = image_grid.read_img(image_name)
    data_jpg = img_processing(im_band,img_data)
    data_jpg_corrted = gamma_trans(data_jpg, 0.5)
    ## 显示 ##
    cv2.imshow('GF1',data_jpg)
    cv2.imshow('Gamma_image',data_jpg_corrted)
    cv2.waitKey()

ArcGIS下显示

拉伸参数设置:

经过Python拉伸处理后的图

经过Gamma变换(系数为0.5)后的图

总结

可以看出,处理后的效果和ArcGIS中的显示效果还是有较大差距,不过图像内容还是能够看出来。其他数据由于没有,所以暂时还没有测试,可能会存在问题,不是可能,严谨点,肯定存在问题。后续根据需要,再慢慢解决吧!

  • 20
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
### 回答1: 好的,我可以回答您关于使用Python进行遥感影像分类的问题。 使用Python进行遥感影像分类可以采用多种方法,常用的包括Scikit-learn、Keras和TensorFlow等。其,Scikit-learn是一个广泛使用的Python机器学习库,包括支持向量机(SVM)、随机森林(Random Forest)和K-近邻(K-Nearest Neighbor)等算法,可用于遥感影像分类。Keras和TensorFlow是针对深度学习任务的Python库,也可以用于遥感影像分类。 遥感影像分类的步骤通常包括:数据预处理、特征提取、模型训练和模型评估等。预处理步骤包括数据清洗、数据增强和数据标准化等。特征提取通常使用卷积神经网络(CNN)等深度学习方法。模型训练可以使用多种算法,包括传统机器学习算法和深度学习算法等。模型评估通常使用交叉验证和混淆矩阵等指标来评估分类器的性能。 希望这些信息能对您有所帮助! ### 回答2: 使用Python进行遥感影像分类是一种常见的方法。首先,我们需要导入合适的Python库,如SciPy、NumPyOpenCV等,以便进行影像数据处理和分析。接下来,我们可以利用Python的图像处理功能对遥感影像进行预处理,如去噪、增强和裁剪等。然后,我们需要选择适当的特征提取方法,常用的包括灰度共生矩阵(GLCM)和主成分分析(PCA)等。这些方法可以将原始的遥感影像转换为具有更高区分度的特征。 在特征提取之后,我们可以使用各种机器学习算法对遥感影像进行分类。常用的算法包括支持向量机(SVM)、随机森林和深度学习算法等。这些算法可以训练一个分类模型,将遥感影像的不同类别进行分类。我们可以利用Python的scikit-learn库来实现这些算法,并使用交叉验证方法来评估分类模型的性能。 此外,Python还提供了丰富的可视化工具,如Matplotlib和Seaborn等,可以帮助我们对分类结果进行可视化展示。通过绘制分类精度图、混淆矩阵和ROC曲线等,我们可以更直观地评估和分析分类结果。 总结起来,使用Python进行遥感影像分类首先需要进行影像预处理和特征提取,然后选择合适的机器学习算法来训练分类模型,最后通过可视化工具对分类结果进行分析。Python作为一种功能强大且易于使用的编程语言,为遥感影像分类提供了丰富的工具和库,使得整个过程更加高效和便捷。 ### 回答3: 使用Python进行遥感影像分类是一个很常见的任务。Python有许多强大的库和工具,可以帮助我们实现遥感影像的分类。 首先,我们需要加载遥感影像数据。我们可以使用Pythongdal库来读取遥感影像数据,它可以处理多种常见的遥感影像格式。通过gdal库,我们可以读取影像的元数据、像素值以及空间信息。 接下来,我们需要对影像进行预处理。常见的预处理步骤包括影像增强、去噪、裁剪等。Python的PIL库和OpenCV库提供了丰富的图像处理函数,可以满足预处理的需求。 在进行分类之前,我们需要提取有意义的特征。可以使用Python的scikit-learn库的特征提取函数,如颜色直方图、纹理特征、形状特征等。通过提取的特征,我们可以将遥感影像转化为数值型数据,以供机器学习算法使用。 最后,我们可以使用不同的机器学习算法对遥感影像进行分类。Python的scikit-learn库提供了多种常用的分类算法,如支持向量机(SVM)、随机森林(Random Forest)和深度学习算法等。通过对训练数据进行训练,我们可以得到一个分类器模型。然后,我们可以使用该模型对新的遥感影像进行分类。 总的来说,使用Python进行遥感影像分类主要包括数据加载、预处理、特征提取和分类算法的应用。Python提供了丰富的库和工具,可以帮助我们实现遥感影像分类的各个环节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值