使用python查看图片数据

news/2024/12/2 20:00:42/

使用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方法的输入,可以显示如下结果:
在这里插入图片描述
以上就是显示图片的方法。


http://www.ppmy.cn/news/656259.html

相关文章

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

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

Ubuntu 下查看图片

Ubuntu下查看图片命令: eog leopard.jpg然后显示: get!

【实用手记】linux下命令行查看图片

注:带有【实用手记】标题的文章主要用于临时备忘,内容不甚详尽,但之后也会视需要对相关知识进行完善。 linux下使用命令行查看图片: eog picturepatheog,即linux的内置图片查看器 eye of gmone 的缩写。 例如&#…

Python 基本数据类型(七)

文章目录 每日一句正能量Set(集合)Dictionary(字典)结语 每日一句正能量 生活里的累,一半源于生活本身,一半源于我们对待生活的态度。当我们感觉疲惫的时候,记得提醒自己保持一种幸福感&#xf…

物联网应用中的 Wi-Fi 6

近年来,设备智联在我们的日常生活中越来越常见。从智能家居设备到工业自动化系统,物联网技术正在改变我们与世界交互的方式。随着物联网设备的不断增多,对可靠、高容量和低功耗无线连接的需求变得尤为迫切。这就是 Wi-Fi 6(即 802…

IAR工具链编译与GCC工具链编译转换问题

由于目前有个项目,需要将GCC编译工具链,转换移植到IAR工程里面,遇到以下问题,以此记录解决过程。使用GCC编译工具链时,void HardFault_Handler(void)函数,是放在exceptions.c文件里面,使用函数实…

C#-协变逆变

协变: ​ 和谐的变化,自然的变化 ​ 因为里氏替换原则,父类可以装子类,所以子类变父类 ​ 比如 string 变成 object,感受是和谐的 ​ 逆变: ​ 逆常规的变化,不正常的变化 ​ 因为里氏替换原则…

超融合究竟带来了什么 超融合方案有哪些优势 企业超融合方案怎么做?

随着智能数据时代的到来,企业对于自身业务、互联网等所产生的海量数据在存储、计算、应用等很多方面的处理需求不断攀升。 根据对企业CIO的调查,CIO心中理想的IT基础设施应该满足三个方面:第一,按需购买。第二,敏捷交付…