python 图片格式转换产生的锯齿问题

来源:互联网 发布:java开源b2b商城系统 编辑:程序博客网 时间:2024/06/01 09:36

这几天一直在帮一个学妹做毕业设计,用深度学习的方法来做遥感图像分类。原来准备将图像分为:林地、道路、裸地、建筑、草地、水域这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脚本工具将图像全都resize224×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    endendimg2(:,:,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),我十分纳闷,情况如下,第一张是原图片,第二张是转换后图片:
这里写图片描述 这里写图片描述
可以明显看到,原先紫红色裸地部分还有边缘区域没有转换为红色。
我将原来的图像放大:
这里写图片描述

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

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

from PIL import Imageimport matplotlib.pyplot as pltimport osimport globHeight = 224 #Required Height for resizeWidth = 224 #Required Width for resizeoutdir = '/path/to/output/your/directory'#/path/to/output/your/directory/for/readimageList = 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,也不会产生混合像元。

再将林地、裸地与草地进行混合,能够很完美的混合了:
这里写图片描述

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

0 0