maltab 语言如何熟练掌握?

为了能够使用numpy,我们需要使用import numpy导入库。此外,指定np代表numpy:

import numpy as np

现在,我们可以通过输入np.name_of_function来访问numpy中所有可用的函数。例如

max = np.max(img)     # 包含无效值
max2 = np.nanmax(img) # 排除无效值

上面这两个函数是有区别的,在遥感中要注意到二者的区别,这一点会再专门的写一篇文章介绍。

在numpy中定义的大多数函数和操作都可以应用于数组。

尝试向其中一个数组添加另一个数字,看看会发生什么。通常,数组需要具有相同的尺寸….

例如:

arr1 = np.array([1,2,3,4])
arr2 = np.array([3,4,5,6])

arr3 = np.add(arr1, arr2)
print(arr3)

动画

数组可以被分割。我们可以使用索引符号[starte: end:stride]来获得数组的子集。让我们来看看这意味着什么:

arr = np.array([0,1,2,3,4,5,6,7,8,9,10])

print(arr[0]) #仅取第一个元素
print(arr[1:]) #从第2个元素开始,结束于最后一个元素
print(arr[2:-1]) #从第三个元素开始,结束于倒数第2个元素
print(arr[::2]) #从第一个元素开始,间隔为2,结束于最后一个元素

numpy

以上也是编程中的切片,一维数组的切片,多练习后就能熟练掌握。

什么是普通图像?

没入门前,会在思考一个问题,什么是普通图像?什么是遥感图像?二者的区别是什么?带着这3个问题,懵懵懂懂敲开遥感技术的大门。

什么是普通图像,普通图像就是手机拍的照片,后缀名是JPG或者是PNG。

什么是遥感图像,遥感图像比普通的图片波段更多,一般具有4波段以上,而且遥感图像是带经纬度,也就是遥感图像是带着坐标系信息,精校正后的遥感图像上的某个像素点对应真实的地面坐标。遥感图像为了保存更多的影像细节,会采取10BIT及其以上的数据类型保存方式,而普通图片采用以8bit及其以下的数据类型保存方式(单反相机拍的RAW数据不是8bit)。

你在win系统是不能直接打开tif文件,但可以打开附带的缩略图,你可以认为tif不是普通图片,而附带的缩略图是普通图片,因为tif一般不是8bit,而缩略图是8bit。

8bit就是0到255的范围。也是2的8次方。

遥感图像说到底也是基于普通图像。君不见,遥感的论文到底是有多少是从计算机视觉延伸过来的?计算机视觉大热的时候,也意味着遥感跟着大热。

tuptng

普通图片就是矩阵

普通图片就是矩阵,就是二维数组。这里做一个简单的例子。

读取数据->数据读到内存->对这个数组进行处理(滤波等等)->保存为新的文件->从内存中保存到硬盘

图像处理大概是大概是这四个步骤。可能是第三个步骤的变动会大些,看具体应用,有些是是用传统的CV手段,有些是深度学习炼丹,但是我们要抓住事物的本质。

现在读取普通图片,使用python中的PIL库。目的为保存为txt文本,展示图片的本质。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PIL import Image
import numpy as np

I = Image.open(r'C:\Users\Administrator\Pictures\1.jpg')
I.show()
I.save('./save.png')  # 保存为新的图片
I_array = np.array(I)  # 转为numpy类
x, y, z = I_array.shape  # 普通图像的长、宽、波段
with open(r'C:\Users\Administrator\Pictures\save.txt', 'w',encoding="utf8") as f:
    for band in range(z):
        f.write('我是第%d波段的数据'%band)
        for column in range(x):
            for line in range(y):
                print("%d波段的%d行%d列像素是:%d" % (band, line, column, I_array[column, line, band]))
                data = str(I_array[column, line, band])
                f.write(data)
                f.write(' ')
            f.write('/n')
        f.write('/n')
        f.write('/n')