首页 飞桨领航团 帖子详情
图像读取的几种方式(cv2, Image, plt都能加载图像,到底有啥区别呢?)
收藏
快速回复
飞桨领航团 文章AI达人创造营 1958 1
图像读取的几种方式(cv2, Image, plt都能加载图像,到底有啥区别呢?)
收藏
快速回复
飞桨领航团 文章AI达人创造营 1958 1

   你有遇到过以下情况吗,本来一张图片在自己电脑中打开是这样的:

  但是用OpenCV打开之后确是这样的:

  有没有一瞬间怀疑是自己电脑屏幕出现了问题?别慌,这其实都是OpenCV加载图片的方式导致的。

  我们去看CV2.imread()的官方文档发现:

  看到这里大概明白了吧。这是因为cv2.imread()接口读进来的图像是BGR格式的,而我想要显示的彩色图像是RGB格式的,所以会显示蓝色居多,其实在cv2中也有对应的方法将读取进来的img进一步类型转换,将其变为RGB图像:

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

  在做图像处理的时候,常用的图像读取方式大概有三种:

  1. OpenCV 的 imread方法
  2. matplotlib 中 的 imread方法
  3. Image 的 open 方法

  这三种方式都能将图像加载进来,那么它们之间到底有啥却别呢?

# 我们以最经典的lena 作为示例
img_path = 'work/lena.jpg'
fig = plt.figure(figsize=(8,8))

ax1 = fig.add_subplot(131)
ax1.set_title("plt.imread")
img1 = plt.imread(img_path)
ax1.imshow(img1)

ax2 = fig.add_subplot(132)
ax2.set_title("cv2.imread")
img2 = cv2.imread(img_path)
ax2.imshow(img2)

ax3 = fig.add_subplot(133)
ax3.set_title("Image.open")
img3 = Image.open(img_path)
ax3.imshow(img3)

  我们可以看出来,plt和Image.open都能显示正常的图片,而cv2显示的偏蓝色。这是因为cv2是BGR,而其余两个是RGB格式。

  然后,我们看这三个的数据格式发现,plt和cv2读取后都是numpy.ndarray的格式,而Image.open 读取后的是一个数组,需要使用numpy.array()转换后,才能和plt和cv2读取后的格式一样。

总结一下:

  cv2.imread plt.imread Image.open
类型 numpy.ndarray numpy.ndarray PIL.JpegImagePlugin.JpegImageFile
图像格式 BGR RGB 数组
2
收藏
回复
全部评论(1)
时间顺序
A
AIStudio713464
#2 回复于2021-07

不错,受益匪浅,加个好友吧

1
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户