这几天一直在帮一个学妹做毕业设计,用深度学习的方法来做遥感图像分类。原来准备将图像分为:林地、道路、裸地、建筑、草地、水域这6个部分,这6部分对应的颜色分别为:
1. 林地:红色 (255, 0, 0) 0xFF0000
2. 道路:黄色 (255, 255, 0) 0xFFFF00
3. 裸地:紫红 (255, 0, 255) 0xFF00FF
4. 建筑:青色 (0, 255, 255) 0x00FFFF
5. 草地:绿色 (0, 255, 0) 0x00FF00
6. 水域:蓝色 (0, 0, 255) 0x0000FF

由于感觉林地、裸地、草地难以区分。即使是强大的深度学习,在样本量不足的情况下,也难以学习到好的特征。于是,想写个脚本把林地、裸地与草地进行合并。
同时,由于使用的是AlexNet,训练图像为224×224大小的,于是我事先通过python脚本工具将图像全都resize 到224×224大小。

之后,通过如下matlab代码将图像中的林地、裸地与草地合并,方法很简单,就是如果图像是裸地的紫红(255,255,0)颜色,便将其转为(255,0,0)颜色,草地同理。

clear;
clc;
close all;

line = (1:224);
column = (1:224);

img = imread('/Users/chenxinpeng/Documents/MATLAB/superpixel-sowerby/groundtruth_png_resize224/Classification90.png');
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);

for i = line
    for j = column 
       %将紫红色的(255,0,255)裸地转变为红色的(255,0,0)林地
       if(R(i,j) == 255 && G(i,j) == 0 && B(i,j) == 255)
          B(i,j) = 0;
       end

       %将绿色的(0,255,0)草地转变为红色的(255,0,0)林地
       if(R(i,j) == 0 && G(i,j) == 255 && B(i,j) == 0)
           R(i,j) = 255;
           G(i,j) = 0;
       end
    end
end
img2(:,:,1) = R;
img2(:,:,2) = G;
img2(:,:,3) = B;
%img2.show()
imwrite(img2,'/Users/chenxinpeng/Documents/MATLAB/superpixel-sowerby/4class_groundtruth_png_resize224/Classification90.png')

但是我发现,经过这段代码,仍有部分不能转换到红色(255,0,0),我十分纳闷,情况如下,第一张是原图片,第二张是转换后图片:

遥感影像阴影去除python python遥感影像地物分类_List

遥感影像阴影去除python python遥感影像地物分类_List_02


可以明显看到,原先紫红色裸地部分还有边缘区域没有转换为红色。

我将原来的图像放大:

遥感影像阴影去除python python遥感影像地物分类_Image_03

可以发现,每种颜色的边缘区有混合像元,那么原因也找到了。就是我进行resize操作的时候,原先纯色像元由于某种原因混合了。

怎么避免呢,这是我原先resize 操作的代码:

from PIL import Image
import matplotlib.pyplot as plt
import os
import glob

Height = 224 #Required Height for resize
Width = 224 #Required Width for resize
outdir = '/path/to/output/your/directory'

#/path/to/output/your/directory/for/read
imageList = sorted(glob.glob('/media/chenxp/Datadisk/labelsample/groundtruth_png/*.png'))

for item in imageList:
    img = Image.open(item)
    temp = os.path.basename(item)
    img = img.resize((Height,Width),Image.ANTIALIAS)
    img.save(os.path.join(outdir,temp))

我原先以为产生混合像元是无法避免的,于是都开始想其他办法了。

突然,我想到可resize 代码里的这么一句话:img = img.resize((Height,Width),Image.ANTIALIAS)。从这个网站,我发现,Image.ANTIALIAS这句话的意思是Image.ANTIALIAS参数表示新生成的图片消除锯齿,我将后面这个参数取消掉。发现既能够成功的resize,也不会产生混合像元。

再将林地、裸地与草地进行混合,能够很完美的混合了:

遥感影像阴影去除python python遥感影像地物分类_深度学习_04

图中黄色的区域是道路,问题解决了。接下来就是训练对比结果了。