如何转换opencv的图片格式在pytorch中使用

首先,如上图所示,opencv读入的图像为 RGB格式,但是我们在pytorch中进行图像处理时,要先将RGB转换成BGR,然后在使用img = Image.fromarray(np.uint8(self.camimg)) 将array转换成image格式,这样转换图片格式后才能够在pytorch中使用。

一般图像的存储方式是H x W x C的顺序(其中H、W、C分别表示图像的高、宽和通道数,通道数一般为RGB三通道),另外,其中的每一个数据都是[0,255]的整数,opencv中图片的格式也是hwc。但在pytorch中为CHW,img = img.transpose(2, 0, 1)。

在使用pytorch的时候,我们通常要使用pytorch中torchvision包下面的datasets模块和transforms模块。而通常情况下在我们使用了这两个模块之后,所处理的图像数据格式已经不是我们所熟知的格式了。下面按照代码来进行讲解:
#导入需要的包和模块
import torch
from torchvision import datasets, transforms
import os
#transforms指明了需要对原始图像做何种变换
data_transforms = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
data_dir = 'original_data’
image_dataset = datasets.ImageFolder(data_dir, data_transforms)
dataloader = torch.utils.data.DataLoader(image_dataset, batch_size=32, shuffle=True, num_workers=0)

代码中首先使用datasets模块读取图像数据,输出的图像类型为PILImage,并且图像中的每一个数据大小范围已经不再是[0,255],而是[0,1]。datasets模块下有好几个读取图像的类,比如CIFAR10、MNIST等能够直接获取标准数据库;而我们代码中所使用的类是ImageFolder,它能够读取本地存放的图像。其中需要指定图像所在文件路径和需要对数据进行的变换。
从上面的data_transforms变量中我们能够看出进行了多种变换,而Compose就是将多种变换组合起来的方法。data_transforms中一共包含了四个变换,前两个是对PILImage进行的,分别对其进行随机大小(默认原始图像大小的0.08-1.0)和随机宽高比(默认原始图像宽高比的3/4-4/3)的裁剪,之后resize到指定大小224;以及对原始图像进行随机(默认0.5概率)的水平翻转。
第三个transforms.ToTensor()的变换操作是关键一步,它将PILImage转变为torch.FloatTensor的数据形式,这种数据形式一定是C x H x W的图像格式加上[0,1]的大小范围,它的作用有归一化和将图像转化为tensor的作用
后面的Normalize变换是对tensor这种数据格式进行的,它的操作是用给定的均值和标准差分别对每个通道的数据进行正则化,即减均值/方差。经过上面一系列的转换之后,我们可以得出的结论是,图像的数据格式首先在维度的排序上发生了改变,其次数据的范围也发生了改变。

使用opecv读取并处理图像,使用matplotlib绘制图像,最终保存为PIL.Image,再使用pytorch的torchvision.transforms.ToTensor()(img)转化成tensor。
具体操作如下:

补充说明:

  1. opencv
    a. 读取图像:
    img = cv.imread(path)
    opencv库使用imread读取得到的默认是一个BGR模式的彩色图像,可以使用cv.cvtColor(img, cv.COLOR_BGR2RGB)将颜色模式转化成RGB。opencv的基本图像类型与numpy数组可以互相转化。因此可以直接调用torch.from_numpy(img)将图像转成tensor。
    b. 保存图像:
    cv.imwrite(path, img)
    c. 绘制图像:
    cv.imshow(name, img)
    opencv的绘制图像操作会将图像以窗口的形式显示在屏幕上,因此需要手动执行中断命令来关闭窗口进程。一般会用到:
    k = cv.waitKey(0) & 0xFF
    if k == 27:
    cv.destroyAllWindows()
    优点:对图像处理的接口丰富,集成了许多常用的图像处理操作:阈值、边缘检测、角点检测、图像滤波、形态学处理、傅里叶变换、直方图均衡、模板匹配、运动检测(meanshift),并且支持人脸部位识别。
    缺陷:opencv在读取图像时,若path错误,仅会返回None,而不会报错,并且opencv不支持使用imread对gif格式的图像进行读取,若要读取gif格式的图像,需要使用gif = cv.VideoCapture(path)得到一个opencv的视频对象,然后使用ret,frame = gif.read()读取该视频对象的一帧。
  2. PIL
    PIL是python对图像处理的基本库
    a. 读取图像:
    img = PIL.Image.open(path)
    读取得到的是一个PIL.xxxImageFile类型,numpy中提供了与将PIL.ImageFile转化为array的接口:
    np.asarray(img) img->array
    Image.fromarray(array) array->img
    可以使用img.convert(model)转换颜色模式。其中model包括:'1’:二值图,'L’:灰度图,'P’:8位彩色图像,'RGB’:24位彩色图像(每个通道8位),'RGBA’:相比RGB多了个alpha通道(不透明度)等等。
    b. 保存图像:
    img.save(path)
    c. 绘制图像:
    img.show()
    优点:支持的图片格式丰富,并且作为python的基本库,与各个库之间兼容性最好。
    缺点:图像处理算法较少。
  3. matplotlib
    matplotlib是python仿照matlab的绘图来开发的图像绘制库。
    a. 读取图像:
    img = plt.imread()
    matplotlib读取的图像类型直接为numpy.array,并且matplotlib读取图像时直接进行了归一化操作。
    b. 保存图像:
    plt.imsave(path,img)

    img.imsave(path)
    matplotlib在保存图像时,可以使用imsave保存不带坐标轴的图像,也可以使用plt.savefig(path)保存带坐标轴的图像。
    c. 绘制图像:
    plt.imshow(img)
    plt.show()
    matplotlib在执行imshow之后,必须跟着执行show()。
    优点:和matlab的绘图命令基本相同,不仅可以绘制图像,也可以绘制其他类型的图像(折线图、散点图、饼图、热力图、3D图),并且读入的图像与numpy直接兼容。
    缺点:matplotlib是一个绘图的库,因此没有图像处理相关的算法。

来源:https://www.icode9.com/content-4-891851.html

(0)

相关推荐

  • (11条消息) Opencv 读取灰度图像会识别为3通道问题

    最近初接触图像cv,一切都是从零开始因此遇到了许多问题,故在此记录遇到的问题方便提醒自己也方便后来人不再困惑. 场景: 我们都知道灰度图或者红外图都是单通道图片,而彩色图片是三通道图片.但是当我们用i ...

  • Python图像处理工具有哪些?五大工具推荐!

    使用Python进行图像处理的时候,肯定避免不了工具,今天小编向大家推荐五款Python图像处理工具,有需求的小伙伴快来看看吧. 1 scikit-image 是一个开源的Python包,适用于num ...

  • 基于OpenCV的实用图像处理操作

    重磅干货,第一时间送达 图像处理适用于图像和视频.良好的图像处理结果会为后续的进一步处理带来很大的帮助,例如提取到图像中的直线有助于对图像中物体的结构进行分析,良好的特征提取会优化深度学习的结果等.今 ...

  • 常见的图像处理技术

    重磅干货,第一时间送达 本期文章中,让我们一起来学习以下内容. 通过PIL和OpenCV来使用一些常见的图像处理技术,例如将RGB图像转换为灰度图像.旋转图像.对图像进行消噪.检测图像中的边缘以及裁剪 ...

  • Python+opencv 图像处理(五)

        灰度反转 "你说的黑是什么黑......"有一首歌的歌词是这样的. 在图像中,黑是什么? 很简单,就是0嘛. 因为在数字图像里,用0表示黑. 那么,"你说的白是什 ...

  • python+opencv图像处理(二)

    python+opencv图像处理(二) ----图像变换 自然界中有很多的颜色,红红的花,绿绿的草,蓝蓝的天,白白的云,多姿多彩的世界,美轮美奂的图像. 通过手机,照相机就可以定格每一个美的瞬间. ...

  • OpenCV-Python,计算机视觉开发利器

    人工智能,一个已经被谈论了几十年的概念(最早是图灵在1950年提出).如今这几年,相关技术的发展速度是越来越快.高大上如无人驾驶.智能安防.AI辅助诊断,接地气如刷脸支付.内容推荐.自动翻译等,众多领 ...

  • 【推荐】Python图像处理工具有哪些?

    对比其他编程语言,Python更适合图像处理,因为Python有好多工具包应用于图像处理当中,既能提高效率,也能节省时间.那么Python图像处理工具有哪些?本文为大家介绍10个Python图像处理工 ...

  • 2021年将主导Python的7大图像处理库

    有没有想过Python的哪个图像处理库将在2021年占据主导地位? 图像在提供关键信息方面起着重要作用.对于企业而言,图像和视频是重要的数据来源. 这就是原因,对于企业而言,有效地翻译和处理图像并获得 ...

  • 【从零学习OpenCV 4】了解OpenCV的模块架构

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【AI基础】OpenCV,PIL,Skimage你pick谁

    汤兴旺 就读于吉林大学汽车工程学院,计算机视觉爱好者,言有三弟子 作者 | 汤兴旺 编辑 | 汤兴旺/言有三 如何对图像进行处理是深度学习图像处理的基础,我们常常需要对图像进行读取.保存.缩放.裁剪. ...

  • 【AI-1000问】为什么OpenCV读取的图像格式是BGR?

    为什么OpenCV存储的图像格式是BGR呢? 做图像处理的我们应该都知道,OpenCV是我们必备的一个工具,我们在使用OpenCV读取图像时你应该也发现了读取出来的数组居然是BGR格式,而不是我们听的 ...

  • 【从零学习OpenCV】 视频数据的读取&摄像头的直接调用

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • python 图像处理:一福变五福

    快过年了,各种互联网产品都出来撒红包.某宝一年一度的集五福(shua hou)活动更是成为每年的必备活动.虽然到最后每人大概也就分个两块钱,但作为一个全民话题,大多数人还是愿意凑凑热闹.毕竟对于如今生 ...

  • [医学图像处理] Python SimpleITK软件包常用参数与使用方法分析 - 程序员大本营

    目前在使用深度学习进行医学图像处理,主要进行肺部结节检测,在预处理时经常会使用到SimpleITK软件包,它是一个很好用的读取医学图像信息软件包. SimpleITK Insight Segmenta ...

  • 在 Google Colab 中使用 OpenCV 进行图像处理简介

    重磅干货,第一时间送达 在这篇文章中,我们将实现如何使用 OpenCV 在 google colaboratory 中进行图像处理.为此,我们应该了解一些 Python 基础知识,下面给出的步骤将帮助 ...

  • [Python图像处理] 八.图像腐蚀与图像膨胀

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...