使用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. 新兴经济体助力BCH长足发展
  2. Flutter开发之ListView组件(21)
  3. 开源Python做的火币和ZB搬砖差价监控程序
  4. jQuery知识点笔记-常用方法
  5. 学习 Swift 的知识点整理
  6. 设计模式之观察者模式--中英文结合理解版
  7. 一文读懂目前大热的AutoML与NAS!
  8. 一步一步学习ObjectDataSource--(3)
  9. 性能测试工具Loadrunner使用之一(Virtual User Generato)
  10. C语言函数未声明错误,switch 调用函数 错误未定义???
  11. Datalogic得利捷全新自动调焦产品 开启扩展扫码新体验
  12. Python 定时任务的几种实现方式
  13. 读《电商产品经理宝典》——重点摘录总结
  14. Kotlin - 改良工厂模式
  15. java 解析 键值_JAVA:解析单个字符串键值对
  16. Docker学习之数据卷操作:Day4
  17. pc 和手机调用摄像头拍照 获取照片 好用
  18. 计算机版学猫叫歌,抖音学猫叫是什么歌
  19. 电信天翼云搭建Halo博客
  20. WEB基本表单及代码(HTML)

热门文章

  1. 服务器r730系统备份软件,服务器r730
  2. office2016设置outlook登录263邮箱步骤
  3. @ConditionalOnProperty 和@Conditional注解作用
  4. 在校计算机专业学生如何学习java?
  5. Android icon适配mipmap
  6. 判断STM32 GPIO输入口的输入状态(高电平或低电平)
  7. vue2过滤器《书山有路勤为径,学海无涯苦作舟》
  8. Excel日期怎么相加 edate函数
  9. Dis-PU复现踩坑
  10. 企业数字化转型的三个阶段与三个层次