Pillow(PIL)和OpenCV读取数据的区别

目录

前言

一、读取图片代码示例

二、两者区别

1.存储格式不同

2.通道顺序不同


前言

在处理计算机视觉任务过程中,经常会用到Pillow和Opencv来处理数据,本文介绍这两者在处理图片时的不同。


一、读取图片代码示例

Pillow (PIL):Pillow 是一个流行的 Python 图像处理库,可以用来打开、处理和保存多种图像格式。您可以使用以下代码来读取图片:

from PIL import Image

# 打开图像文件
image = Image.open('image.jpg')

# 显示图像
image.show()

 OpenCV:OpenCV 是一个计算机视觉库,支持多种图像和视频处理任务。您可以使用以下代码来读取图像:

import cv2

# 读取图像文件
image = cv2.imread('image.jpg')

# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、两者区别

1.存储格式不同

Pillow将图像以PIL(Python Imaging Library)的Image对象的形式加载到内存中。OpenCV将图像以NumPy数组的形式加载到内存中。

    import cv2
    path=r'E:\cv_code\ZYH\SenseEarth2020-ChangeDetection-master\data\dataset\train\im1\00003.png'
    img1=cv2.imread(path)
    img2=Image.open(path)
    print(img1)
    print("**************")
    print(img2)

输出:

 通过numpy.array()将PIL数据处理为Numpy数组。

2.通道顺序不同

OpenCV(cv2)在读取图像数据时通常不会按照CHW(通道、高度、宽度)的顺序排列数据,而是按照HWC(高度、宽度、通道)的顺序排列数据。这意味着数据数组的维度通常是(height, width, channels),而不是(channels, height, width)。例如,如果您使用OpenCV读取一张彩色图像,通道顺序通常是BGR(蓝绿红),并且数据的维度将是(height, width, 3),其中3表示三个颜色通道。

Pillow(PIL)库在处理图像时也按照HWC(高度、宽度、通道)的顺序排列数据,而不是CHW(通道、高度、宽度)的顺序。这意味着使用Pillow库读取图像后,数据的维度通常是(height, width, channels)。例如,如果您使用Pillow打开一张彩色图像,通道顺序通常是RGB(红绿蓝),并且数据的维度将是(height, width, 3),其中3表示三个颜色通道。

    import cv2
    path=r'E:\cv_code\ZYH\SenseEarth2020-ChangeDetection-master\data\dataset\train\im1\00003.png'
    img1=cv2.imread(path)
    img2=Image.open(path)
    img3=np.array(img2)
    print(img1)
    print("**************")
    # print(img1.transpose(2,0,1).shape)
    # print(img2)
    print(img3)

输出: 

[[[ 48  62  55]
  [ 53  68  58]
  [ 54  68  61]
  ...
  [132 134 129]
  [136 136 131]
  [134 136 131]]

 [[ 43  56  46]
  [ 46  61  51]
  [ 48  63  53]
  ...
  [133 133 128]
  [135 135 130]
  [136 136 131]]

 [[ 48  61  51]
  [ 49  64  54]
  [ 50  65  55]
  ...
  [132 132 127]
  [134 134 129]
  [135 135 130]]

 ...

 [[ 59  72  77]
  [ 60  73  78]
  [ 60  73  78]
  ...
  [110 117 120]
  [108 115 118]
  [108 115 118]]

 [[ 59  72  77]
  [ 59  72  77]
  [ 59  72  77]
  ...
  [108 115 118]
  [105 112 115]
  [103 110 113]]

 [[ 58  71  76]
  [ 58  71  76]
  [ 59  72  77]
  ...
  [109 116 119]
  [104 111 114]
  [103 110 113]]]
**************
[[[ 55  62  48]
  [ 58  68  53]
  [ 61  68  54]
  ...
  [129 134 132]
  [131 136 136]
  [131 136 134]]

 [[ 46  56  43]
  [ 51  61  46]
  [ 53  63  48]
  ...
  [128 133 133]
  [130 135 135]
  [131 136 136]]

 [[ 51  61  48]
  [ 54  64  49]
  [ 55  65  50]
  ...
  [127 132 132]
  [129 134 134]
  [130 135 135]]

 ...

 [[ 77  72  59]
  [ 78  73  60]
  [ 78  73  60]
  ...
  [120 117 110]
  [118 115 108]
  [118 115 108]]

 [[ 77  72  59]
  [ 77  72  59]
  [ 77  72  59]
  ...
  [118 115 108]
  [115 112 105]
  [113 110 103]]

 [[ 76  71  58]
  [ 76  71  58]
  [ 77  72  59]
  ...
  [119 116 109]
  [114 111 104]
  [113 110 103]]]

CHW通道顺序通常更常见于深度学习框架,如PyTorch和TensorFlow,因为它们通常期望输入数据的通道维度在前面。如果您希望将OpenCV读取的图像数据转换为CHW顺序,您可以使用NumPy来进行维度的重新排列。例如,在Python中,您可以这样做:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg')

# 将数据从HWC转换为CHW
image_chw = np.transpose(image, (2, 0, 1))

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值