看小伙是如何用python尽览我国植被覆盖率的沧海变化

看小伙是如何用python尽览我国植被🌳覆盖率的沧海变化

前言

昨天学弟给了我一个数据包“我国NDVI的栅格数据”(即归一化植被指数),需要把陕西省的数据批量裁剪出来。

于是,我拿出python。“刷刷刷~”,搞定了:
在这里插入图片描述
这就完事了? 作为深度践行勤俭节约的社会主义好青年的kimol君,当然不会浪费资源。于是,我决定用这个数据来分析一下我国植被覆盖率变化的沧海桑田(以陕西省为例)。

先上图,让大家伙一睹为快:
在这里插入图片描述
可以很直观地看出,从1998-2018年,陕西省(尤其是陕北地区)的植被覆盖率正在不断增加。我想,这离不开国家治沙工程的大力推行,更离不开许许多多护林治沙先辈们的辛勤付出~(手动敬礼中…)

一、栅格数据转为灰度图

本次用到的数据是NDVI栅格数据,它是以“.tif”为后缀的。简单来理解的话,我们可以把它看作一张图,每个像素点的值代表了该位置的归一化植被指数。为了更方便展示,我们将其转为灰度图:

首先读取tif数据:

def transfer(img):
    '''
    将tif转为灰度图
    '''
    for x in range(img.shape[0]):
        for y in range(img.shape[1]):
            if img[x][y] < 0:
                img[x][y] = 0
            else:
                img[x][y] *= 255
    return img
    
# 创建文件夹用于存储灰度图
grayPath = './gray'
if not os.path.exists(grayPath):
    os.mkdir(grayPath)

# 遍历tif文件
tifPath ='./data'
for file in os.listdir(tifPath):
    if file.endswith('.tif'):        
        img = cv2.imread('%s/%s'%(tifPath, file), 2)
        transfer(img) # 转为灰度格式
        cv2.putText(img,'Year %s'%file[9:13], (20,40), cv2.FONT_HERSHEY_SIMPLEX, 1.0,(255,255,255), 1, cv2.LINE_AA) # 加入年份说明
        cv2.imwrite('%s/%s.png'%(grayPath, file.split('.')[0]), img)
        print('"%s"处理完毕!'%file)

其中cv2.putText是为了在图片上加入年份,方便区分,最后得到灰度图如下:
在这里插入图片描述

然而,灰度图似乎显得不太友好,为了更直观地表现出植被覆盖率,我决定将其转为“伪彩色”。

二、灰度图转为伪彩色图

我们根据像素点的灰度值来定义三个颜色区间(绿),并进行转换:

def trans_color(img):
    '''
    将灰度图转为伪彩色
    '''
    for x in range(img.shape[0]):
        for y in range(img.shape[1]):
            if img[x][y][0] == 0 and img[x][y][1] == 0 and img[x][y][2] == 0: # 边缘区域跳过
                continue
            gray = img[x][y][0]
            if gray <= 110: # 红
                img[x][y][0] = 0
                img[x][y][1] = gray*1.5
                img[x][y][2] = 255
            elif gray <= 200: # 黄
                gray -= 85
                img[x][y][0] = 0
                img[x][y][1] = 255
                img[x][y][2] = 255-(127*gray/85)
            else: # 绿
                gray -= 170
                img[x][y][0] = 0
                img[x][y][1] = 255
                img[x][y][2] = 127-(127*gray/85)
    return img

需要注意的是,cv2.imread默认读取的模式并非RGB而是BRG。

遍历灰度图片,并转换:

# 创建文件夹用于存储彩色图
rgbPath = './rgb'
if not os.path.exists(rgbPath):
    os.mkdir(rgbPath)
    
# 将灰度图转为彩色图
for file in os.listdir(grayPath):
    img = cv2.imread('%s/%s'%(grayPath, file))
    trans_color(img) # 转换
    cv2.imwrite('%s/%s'%(rgbPath, file), img)
    print('"%s"转换完毕!'%file)

于是,我们得到了彩色的图片:
在这里插入图片描述

三、合成为gif

利用imageio库,将众多图片合成为一张gif图:

def create_gif(image_list, gif_name, duration=0.35):
    '''
    生成gif
    '''
    frames = []
    for image_name in image_list:
        frames.append(imageio.imread(image_name))
    imageio.mimsave(gif_name, frames, 'GIF', duration=duration)
    return

# 合成gif图
images_list = []
for file in os.listdir(rgbPath):
    images_list.append('%s/%s'%(rgbPath, file))
create_gif(images_list, 'NDVI.gif')

于是,我们便有了前言中的那张图,收工~

写在最后

先辈们用坚毅的品质告诉了我们什么叫敢为人先;
先辈们用辛勤的汗水告诉了我们什么叫持之以恒;
先辈们用喜人的成果告诉了我们什么叫锐意进取。

我辈又有何种理由不奋进呢?

我是kimol君,咋们下次再会~
在这里插入图片描述
创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)

  • 384
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 344
    评论
以下是用 Python 实现自适应差分进化算法的示例代码: ```python import numpy as np class DE: def __init__(self, func, dim, popsize=10, f=0.5, cr=0.7, maxiter=100): self.func = func self.dim = dim self.popsize = popsize self.f = f self.cr = cr self.maxiter = maxiter def run(self): pop = np.random.rand(self.popsize, self.dim) fitness = np.zeros(self.popsize) for i in range(self.popsize): fitness[i] = self.func(pop[i]) best_idx = np.argmin(fitness) best = pop[best_idx] best_fitness = fitness[best_idx] for it in range(self.maxiter): for i in range(self.popsize): r1, r2, r3 = np.random.choice(self.popsize, 3, replace=False) while r1 == i or r2 == i or r3 == i: r1, r2, r3 = np.random.choice(self.popsize, 3, replace=False) xi = pop[i] xr1, xr2, xr3 = pop[r1], pop[r2], pop[r3] vi = xr1 + self.f * (xr2 - xr3) mask = np.random.rand(self.dim) < self.cr ui = np.where(mask, vi, xi) fitness_ui = self.func(ui) if fitness_ui < fitness[i]: pop[i] = ui fitness[i] = fitness_ui if fitness_ui < best_fitness: best = ui best_fitness = fitness_ui # 自适应调整 F 和 CR mean_fitness = np.mean(fitness) if mean_fitness != 0: F = np.mean(np.abs(fitness - mean_fitness)) / mean_fitness self.f = 0.5 + 0.2 * F if best_fitness != 0: CR = 1 - np.mean(np.abs(fitness - best_fitness)) / best_fitness self.cr = 0.1 + 0.9 * CR print("Iteration {}: Best Fitness = {}".format(it+1, best_fitness)) return best, best_fitness ``` 其中,`func` 是需要优化的目标函数,`dim` 是变量维度,`popsize` 是种群大小,`f` 和 `cr` 分别是差分进化算法中的缩放因子和交叉概率,`maxiter` 是最大迭代次数。 在 `run` 方法中,首先随机生成初始种群 `pop`,计算每个个体的适应度 `fitness`,并记录最优个体和适应度。然后开始迭代,对于每个个体,随机选择三个不同的个体 `xr1`、`xr2` 和 `xr3`,然后根据公式计算新个体 `vi` 和 `ui`,并计算新个体的适应度 `fitness_ui`。如果新个体的适应度比原个体的适应度更好,则接受新个体。同时,记录最优个体和适应度。 在每次迭代后,根据当前种群的适应度情况自适应调整缩放因子 `f` 和交叉概率 `cr`。最后返回最优个体和适应度。 使用方法如下: ```python import math # 目标函数是 Rastrigin 函数 def rastrigin(x): return 10 * len(x) + sum([xi**2 - 10 * math.cos(2*math.pi*xi) for xi in x]) de = DE(rastrigin, 10) best, best_fitness = de.run() print("Best Solution: {}, Best Fitness: {}".format(best, best_fitness)) ``` 这里优化的是 Rastrigin 函数,变量维度为 10。可以根据需要修改目标函数和变量维度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值