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

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

可以发现,每种颜色的边缘区有混合像元,那么原因也找到了。就是我进行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,也不会产生混合像元。

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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值