python中opencv 与 PIL读图区别,以及与Numpy转换

之前在图片预处理上就遇到过opencv和PIL,很纠结PIL读取的图片不好在opencv上使用,或者是opencv读取的图片不好在PIL上使用,以及它们如何转换为numpy类型。现在有时间,做个小实验总结一下

附上代码

import numpy as np
import cv2
from PIL import Image
import matplotlib.pyplot as plt
img_cv2 = cv2.imread("jena.jfif")
img_PIL = Image.open("jena.jfif")
array_img_PIL = np.array(img_PIL) #转为numpy的array形式
#取部分数据显示 opencv bgr排列,PIL rgb排列
print("img_cv2:\n",img_cv2[:3,0,:])
print("img_pil:\n",array_img_PIL[:3,0,:])

plt.subplot(1,2,1)
plt.title("img_PIL")
plt.imshow(array_img_PIL) #使用img_PIL也可以显示,这里直接使用array
plt.subplot(1,2,2)
plt.title("img_cv2")
plt.imshow(img_cv2)
plt.show()

#将rgb排列形式转为bgr排列形式,然后用opencv函数来显示就是正常的图片了
pil_to_cv2_img = cv2.cvtColor(array_img_PIL,cv2.COLOR_RGB2BGR)
print("img_pil_to_cv2\n",pil_to_cv2_img[:3,0,:])
cv2.imshow("pil_to_cv2_img",pil_to_cv2_img)
cv2.waitKey(0)

结果如下:
使用plt分别画出的plt读取的图和opencv读取的图:
使用plt分别画出的plt读取的图和opencv读取的图
打印图片部分数据进行对比:
img_cv2:
[[112 152 224]
[110 151 224]
[104 149 223]]
img_pil:
[[224 152 114]
[223 151 111]
[222 149 104]]
img_pil_to_cv2
[[114 152 224]
[111 151 223]
[104 149 222]]

从前2组数据可以看出,opencv读取的图和PIL读取的图在r和b通道互换了,这里要说明一点,opencv和plt读取的图片像素值不是完全相同的,大致相同。

将PIL图片转化为opencv格式的图片,即将rgb排列形式转为bgr排列形式,然后用opencv函数来显示就是正常的图片了。这里使用了 cv2.cvtColor()进行转换,从后2组数据可以看出,r和g通道数据进行了互换。

整个流程:

img_PIL = Image.open("jena.jfif")
array_img_PIL = np.array(img_PIL) #转为numpy的array形式
pil_to_cv2_img = cv2.cvtColor(array_img_PIL,cv2.COLOR_RGB2BGR)
cv2.imshow("pil_to_cv2_img",pil_to_cv2_img)
cv2.waitKey(0)

在这里插入图片描述

说了半天,如何将opencv或PIL读取的图片转换为numpy的array类型呢?

其实上面的代码就已经交代好了,通过cv2.imread()返回的结果就是array类型,PIL需要通过np.array()进行转化。图片显示,不管是opencv,还是PIL,都可以直接使用array。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章