使用python查看图像数据

在学习图像分割前,发现对如何查看图像数据完全不熟悉,在查看了Fast.ai框架的源码后,本文记录了在图像数据为Tensor类型的情况下,显示图像数据的过程。

参考资料:fast.ai源码

1. 查看文件路径

本篇使用了CAMVID数据集,下载后文件目录结构如下所示:

以images为例,打开该文件夹后,有701张图片

有了图片路径,可以将所有图片的绝对路径存为一个list,如下所示:

def getImageFiles(path:str):"递归地查找图片文件"result = []for rootDir, Dir, files in os.walk(path):for file in files:if '.png' in file or '.jpg' in file:result.append(Path(path)/file)breakreturn result
img_path = 'C:/Users/ASUS/.fastai/data/camvid/images' #文件上级目录
imageFilesPath = getImageFiles(img_path)

此处rootDir代表文件夹路径,Dir代表下一级文件夹路径(如果在rootDir里之前创建过某个文件夹A,此处会保存A的路径字符串),这两个变量目前没啥用,files保存了rootDir下的所有文件的路径列表。
第二个loop用来做一个简单粗暴的过滤,过滤掉不是.PNG,.JPG格式的文件,并把.PNG,.JPG文件路径全部放入一个result列表里并return。

可以输出imageFilesPath[0]查看结果,如下所示:

WindowsPath('C:/Users/ASUS/.fastai/data/camvid/images/0001TP_006690.png')

标签图片文件在labels文件夹中,发现图片名有规律可循,如labels 中图片名字比images文件名字多一个‘_P’, 所以可以继续用上面的方式得到labels文件路径,也可以通过fast.ai教程里lambda来将图片文件名转换为标签图片名。


getLblPath = lambda x : path_lbl/f'{x:stem}'_P'{x.suffix}'
#测试用例
lbl_name = getLblPath(imageFilesPath[0])
imageFilesPath[0], lbl_name

运行结果为:

 WindowsPath('C:/Users/ASUS/.fastai/data/camvid/images/0001TP_006690.png'),
(WindowsPath('C:/Users/ASUS/.fastai/data/camvid/labels/0001TP_006690_P.png'))
2. 显示图片
2.1 读取图片

数据集,标签路径已知后,就可以显示图片了,这里参考fastai源码,在显示图片的同时,return torch的tensor类型数据,将第3维度转为第1维度,如下所示:

def openImage(path:Path, figsize:tuple = (3, 3)):img = PIL.Image.open(path).convert('RGB')img = Tensor(np.array(img))img = pil2tensor(img, np.float32)img = img/255return img

这里使用PIL库来加载一个图片数据,并转为Tensor数据,最后返回这个数据。

2.2 读取标签图片

首先读取标签图片,但标签图片是2维的,为了和数据图片匹配,要扩展一个维度,并将第三个维度转到第一个维度上,再返回成Tensor,如下所示

def openMask(path:Path):img = PIL.Image.open(path).convert('L')#灰度图像模式img = pil2tensor(img, np.float32)return img
def pil2tensor(image:np.ndarray,dtype:np.dtype):"Convert PIL style `image` array to torch style image tensor."a = np.asarray(image)print(a.shape)if a.ndim==2 : a = np.expand_dims(a,2)a = np.transpose(a, (1, 0, 2))a = np.transpose(a, (2, 1, 0))return torch.from_numpy(a.astype(dtype, copy=False) )
#测试用例
mask = openMask(get_y_fn(imageFilesPath[10]))
image = openImage(imageFilesPath[10])#openImage会返回浮点 torch.Size([720, 960, 3])
mask.shape, image.shape

运行结果如下所示:

torch.Size([1, 720, 960])
torch.Size([3, 720, 960])
2.3 显示图片

如果是普通的三通道图片(RGB等)可以用imshow方法输入numpy数据来显示图片,将一维度和三维度转换(如[3, 720, 960]->[720, 960, 3]),但是标签数据只有一个通道,所以额外转换成二维的numpy输入([1, 720, 960]->[720, 960, 1]->[720, 960]),再显示图片。代码如下所示(参考fast.ai 源码):

def ifnone(a:Any,b:Any)->Any:return b if a is None else a
def image2np(image:Tensor)->np.ndarray:"Convert from torch style `image` to numpy/matplotlib style."res = image.cpu().permute(1,2,0).numpy()#此处作用是调换原有维度位置return res[...,0] if res.shape[2]==1 else res #抽取最后一个维度的第0个数据def show(img:Tensor, figsize:tuple=(3, 3), title:Optional[str]=None, hide_axis:bool=True,cmap:str=None, alpha:float=None):cmap = ifnone(cmap, 'viridis')fig, ax = plt.subplots(figsize=figsize)xtr = dict(cmap=cmap, alpha=alpha)ax.imshow(image2np(img.data), **xtr)if hide_axis: ax.axis('off')return axif title is not None: ax.set_title(title)

将mask 和 image 都作为show方法的输入,可以显示如下结果:

以上就是显示图片的方法。

使用python查看图片数据相关推荐

  1. python导入图片数据_Python中读取图片的6种方式

    Python进行图片处理,第一步就是读取图片,这里给大家整理了6种图片的读取方式,并将读取的图片装换成numpy.ndarray()格式.首先需要准备一张照片,假如你有女朋友的话,可以用女朋友的,没有 ...

  2. 用python查看音频数据量#用python对音频图片截取保留拼接#根据乐谱生成音乐

    声音是如何转化为数据的? 设备录制声音声音后,根据声音的振幅呈现出振幅图.横轴为时间线,纵轴为振幅. 对声音时间线采样 声音转化为数据的过程,就是将连续的时间每一个固定的时间间隔取一个幅度值,把时间离 ...

  3. python查看图片的gps_浅析python中获取图片中exif中的gps方法

    现在很多手机都支援在照片中的exif中存储位置gps信息了,不过有时假如我们想在在线地图中定位照片中却犯了难,windows或acdsee显示的都是度分秒的方式,不能复制也不适宜得到到在线地图中定位, ...

  4. python查看图片的源代码_python获取图片元数据的代码

    exif-py是一个纯python实现的获取图片元数据的python库,官方下载地址: http://exif-py.svn.sourceforge.net/viewvc/exif-py/source ...

  5. python查看图片的源代码_python实现图片筛选程序

    今天因工作需要写了个小程序,用于在图片集中自动抽取需要的照片.该程序只是实现了基本功能,还有很多需要完善的地方,展示出来算是给自己鼓鼓气吧. 该程序应用有一定特殊条件,因我选择的图片集是工业生产过程中 ...

  6. python查看图片颜色统计_Python通过PIL获取图片主要颜色并和颜色库进行对比的方法...

    本文实例讲述了Python通过PIL获取图片主要颜色并和颜色库进行对比的方法.分享给大家供大家参考.具体分析如下: 这段代码主要用来从图片提取其主要颜色,类似Goolge和Baidu的图片搜索时可以指 ...

  7. python 读取图片数据

    在当前很多应用中,都需要涉及图片处理.例如常见的手写体识别.车牌号码识别.人脸/动物识别等.由于我们通常得到的都是图片,这就需要我们将图片转换成数据.下面我分别针对灰度图图片转换处理. 这里使用的是手 ...

  8. python查看图片的源代码,python网络爬虫源代码(可直接抓取图片)

    1.根据给定的网址获取网页源代码 2.利用正则表达式把源代码中的图片地址过滤出来 3.根据过滤出来的图片地址下载网络图片 import re import urllib.request def get ...

  9. python 安装PIL模块,并且查看图片大小

    文章目录 1.安装PIL(pip install Pillow) 2.使用python查看图片大小 2.1 爬取图片的响应字节,查看图片大小(个人项目需求) 2.2 使用os模块查看本地文件的大小(包 ...

最新文章

  1. java jvm崩溃_IObjects java 代码导致jvm崩溃了
  2. 浙大python判断两个字符串是否为变位词_python数据结构与算法 变位词
  3. php class使用方法,php的类使用方法问题
  4. idea 解决jar 的冲突
  5. php缩放库,php的缩放图像类使用
  6. 【Renpy】renpy游戏引擎制作的游戏拆包及汉化教程
  7. IReport导出PDF字体加粗失效
  8. 微商模式的出路在哪里?
  9. c# 汉语拼音排序函数
  10. matlab三极管名称,三极管常用型号大全(收藏)
  11. 如何制定有效的项目管理计划?
  12. 模电_热敏PTC电阻_NTC电阻-区别与作用-20190507
  13. 点击扫一扫二维码返回文本内容
  14. cmd把一个较大的文件分割_将文件分割成较小的文件
  15. asp.net paypal信用卡支付功能
  16. 5.2 PMBOK--收集需求
  17. 常见数学中的特殊符号
  18. 服务器的ip端口加密协议混淆,Obfsproxy - 混淆/加密端口数据
  19. 批量制作PR字幕——雷特字幕插件
  20. 一位大龄程序员所经历的面试的历炼和思考

热门文章

  1. 什么是盒模型(Box Model)
  2. 自问自答-水听器电信号与声谱级的相互转换
  3. PSSE潮流数据输入文件及与IEEE潮流数据文件的转化
  4. Java 开发 (实习生/应届生) 完整学习路线和规划,希望能够帮到屏幕前迷茫的你
  5. python画布按钮颜色随机切换_我想让每次点换颜色按钮换一个随机色,该怎么写?...
  6. 怎么去把文章多平台分发?
  7. Unity中的Shuriken粒子系统(6)
  8. AD18的常用操作及快捷键
  9. 说说短线,交易模型与交易系统
  10. 技术博主的工具箱分享