cv2与PIL的一点不同

本文讨论了在使用cv2和PIL读取及处理图像时的差异,包括图像维度顺序和resize方法。cv2加载的图像通道顺序为BGR,而PIL则是RGB。在resize方面,cv2采用插值,PIL默认裁剪。提到PIL转换为np.array后的形状与cv2一致,但需要注意颜色通道顺序。文章还提及了torch的pooling操作可类似实现插值,并求教于社区寻找等效于cv2.resize的简单方法。
部署运行你感兴趣的模型镜像

最近在dataloader的时候,读取图片需要用到cv2 和PIL的转换,所以在读取图片的时候,发现了一些不同之处,感觉还挺绕的,mark一下。

cv2:

cv2.imread()

读取出来的直接是np的array.

img.shape = [h,w,c] 
cv2.resize(size=(w,h))

此处的图像尺寸是有细微差别的,应该在官方的docs上是可以查到的:

height, width = img.shape[:2] res = cv.resize(img,(2 * width, 2 * height),
interpolation = cv.INTER_CUBIC)

PIL:

img = Image.open()
img = np.array(img),

需要多一步转化为np的array.
同时作为PIL的对象,

img.size=[w,h] 

但是当转化为np后,

img.shape = [h,w,c]

在数组顺序上是与cv2相同的,但是在c的顺序上是有细微区别的:
cv2 -> PIL : BGR -> RGB

一些疑问

此外,PIL的resize是对图像划定部分进行裁剪,而不是像cv2一样进行插值,目前所知的可以像cv2一样对图像进行插值的就是torch的pooling操作。

有没有大神也可以指导一下其他可以实现等效resize的简单方法 :)

您可能感兴趣的与本文相关的镜像

PyTorch 2.8

PyTorch 2.8

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### PIL OpenCV 的对比 #### 功能差异 PIL(Python Imaging Library)专注于基本的图像处理操作,如裁剪、调整大小、颜色模式转换等。相比之下,OpenCV 是一个更为全面的计算机视觉库,不仅支持基础图像处理功能,还提供高级算法用于特征检测、对象识别等领域[^2]。 #### 图像读取方式的不同 对于图像文件的操作,在PIL中通过`Image.open()`函数加载图片并返回一个`Image`类实例;而在OpenCV里则是利用`cv2.imread()`来获取numpy数组形式的数据表示。这种设计上的不同反映了两者面向的应用场景有所侧重——前者更偏向于简单直观的照片编辑需求,后者则适合复杂多变的研究开发环境。 #### 显示机制的区别 当涉及到展示图像时,两个库也采取了截然不同的策略。PIL依赖内置的方法`show()`调用系统的默认查看器呈现结果;相反地,OpenCV借助专门构建的窗口系统(`imshow`)加上事件循环(`waitKey`)实现交互式的可视化体验,给予开发者更大的灵活性去定制界面布局响应行为。 #### 数据结构色彩空间 值得注意的是,尽管都能很好地完成各自的任务,但在内部数据组织上二者存在明显差别:PIL倾向于采用基于像素点的颜色通道分离存储方案;而OpenCV习惯性地运用BGR顺序排列三原色分量构成矩阵式结构。因此,在互转过程中需要注意这一点以确保最终效果的一致性[^1]。 ### 转换示例 为了方便理解如何在这两种格式间切换,下面给出一段简单的代码片段: ```python import cv2 from PIL import Image import numpy as np def opencv_to_pil(image_cv): """Convert an OpenCV BGR image to a PIL RGB image.""" color_converted = cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB) pil_image = Image.fromarray(color_converted) return pil_image def pil_to_opencv(pil_image): """Convert a PIL RGB image to an OpenCV BGR image.""" open_cv_image = np.array(pil_image) # Convert RGB to BGR open_cv_image = open_cv_image[:, :, ::-1].copy() return open_cv_image ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值