Python图像对比: opencv matplotlib.pyplot PIL.Image

本文注重对三种Python下常用的图像操作库。
分别从以下几个方面进行对比说明:

  • 图像读取
  • 图像显示
  • 色彩转换
  • 图像保存

目录

图像读取

open cv 读取方式

import cv2
color_image = cv2.imread('./logo.jpg', 1)
gray_image = cv2.imread('./logo.jpg', 0)
print('for color image:', color_image.dtype, color_image.size, color_image.shape)
print('for gray image:', gray_image.dtype, gray_image.size, gray_image.shape)
print('max is', np.max(color_image))
print('min is', np.min(color_image))

运行后输出信息:

for color image: uint8 2227200 (725, 1024, 3)
for gray image: uint8 742400 (725, 1024)
max is 255
min is 0

可知opencv读入图片以numpy矩阵的形式存放,默认为0-255.
在读取图像时,可以规定读入方式,1为读入彩色图像,0为读入灰度图像。
需要注意的是,opencv默认以BGR的顺序读入图像!

matplotlib.pyplot 读取方式

import matplotlib.pyplot as plt
color_image_plt = plt.imread('./logo.jpg')
print('for color image:', color_image_plt.dtype, color_image_plt.size, color_image_plt.shape)
print('max is', np.max(color_image_plt))
print('min is', np.min(color_image_plt))

输出为

for color image: uint8 2227200 (725, 1024, 3)
max is 255
min is 0

可知plt将读入的图像同样以numpy形式存放,但是其读入的通道顺序为RGB.
可以通过如下方式验证:
关于第一个维度:
color_image_plt[:,:,1] == color_image_cv2[:,:,1]
输出为

array([[ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True,  True,  True],
       ..., 
       [ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True,  True,  True]], dtype=bool)

而关于第二个维度和第三个维度:
color_image_plt[:,:,0] == color_image_cv2[:,:,0]
color_image_plt[:,:,2] == color_image_cv2[:,:,2]
得到的结果都是

array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ..., 
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]], dtype=bool)

PIL.Image读取方式

color_image_PIL = Image.open('./logo.jpg')
在通过print('for color image:', color_image_PIL.dtype, color_image_PIL.size, color_image_PIL.shape)测试读入内容时,得到以下错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-35-c75b8e9d4f68> in <module>()
      1 color_image_PIL = Image.open('./logo.jpg')
----> 2 print('for color image:', color_image_PIL.dtype, color_image_PIL.size, color_image_PIL.shape)

AttributeError: 'JpegImageFile' object has no attribute 'dtype'

究其原因,这是因为相比于cv2pltPIL有自己的图像文件格式。但是PIL的文件格式是可以和numpy格式的内容相互转换。

from PIL import Image
color_image_PIL = Image.open('./logo.jpg')
print(type(color_image_PIL), np.min(color_image_PIL), np.max(color_image_PIL))
color_image_PIL_numpy = np.array(color_image_PIL)
print('color_image_PIL_numpy:', color_image_PIL_numpy.dtype, color_image_PIL_numpy.size, color_image_PIL_numpy.shape)

输出为

<class 'PIL.JpegImagePlugin.JpegImageFile'> 0 255
color_image_PIL_numpy: uint8 2227200 (725, 1024, 3)

同样,numpy形式保存的图像也可以转换为PIL的图像格式:
color_image_PIL_numpy2PIL = Image.fromarray(color_image_PIL_numpy)
type(color_image_PIL_numpy2PIL)

输出为
PIL.Image.Image

图像显示

open cv 显示方式

logo_cv2 = cv2.imread('logo.png')
print(logo_cv2.shape)
cv2.imshow('logo',logo_cv2)
cv2.waitKey(0)
cv2.destroyAllWindows()

得到的输出为

(571, 750, 3)

图像显示窗口:
cv2窗口

opencv显示图像时,通过调用cv2.imshow()方法,要指定窗口名称winname和显示内容mat,并且要配合waitkeydestoryallwindosw方法使用。略显繁琐。

matplotlib.pyplot 读取方式

logo_plt = plt.imread('logo.png')
print(logo_plt.shape)
plt.imshow(logo_plt)

得到的结果为
plt显示方式

PIL.Image显示方式

logo_PIL = Image.open('logo.png')
print(type(logo_PIL))
logo_PIL.show()

输出为

<class 'PIL.PngImagePlugin.PngImageFile'>

显示窗口为
PIL
点击图像会弹出控制面盘
控制面盘

以上即为三种工具不同的图像显示方法。

色彩转换

open cv 转换方式

在读取图像时,可以制定读取的色彩模式,参数为1或为空则读为RGB,如果是0则读为灰度图。

logo_cv2_gray = cv2.imread('logo.png', 0)
logo_cv2_gray.shape

得到输出为

(571, 750)

说明图像读入为灰度图像。
如果在程序中需要将彩色图像转为灰度图像,可以采用:

logo_cv2_conv_gray = cv2.cvtColor(logo_cv2, cv2.COLOR_BGR2GRAY)
logo_cv2_conv_gray.shape

可以看到彩色图像的三通道已经转为了灰度图像的单通道。

matplotlib.pyplot 转换方式

这个貌似不常用,常用的方法一般是搭配skimage使用,举例如下:

from skimage import data  
from skimage.color import grey2rgb,rgb2gray  
logo_plt__gray = rgb2gray(logo_plt)
logo_plt__gray.shape

得到的输出为

(571, 750)

从而转换图像

PIL.Image转换方式

opencv类似,PIL也可以在读入图像时进行色彩转换,实现如下

logo_PIL_gray = Image.open('logo.png').convert('L')
logo_PIL_gray.size

得到的输出为

(571, 750)

如果在程序中想进行转换,也是使用同样的方法:

logo_plt_conv_gray = logo_PIL.convert('L')
logo_plt_conv_gray.size

得到是输出也是

(571, 750)

色彩保存

open cv 转换保存

cv2.imwrite('./logo_cv2_save.jpg', logo_cv2)
cv2.imwrite('./logo_cv2_gray_save.jpg', logo_cv2_gray)

保存成功后会得到反馈

True

matplotlib.pyplot 保存方式

plt.imsave('./logo_plt_save.png', logo_plt)
plt.imsave('./logo_plt_gray_save.png', logo_plt__gray)

使用这个命令,彩色图像正常保存,灰度图像却被保存为了伪彩色图像,如下所示。具体原因未明确。
伪彩色图像

PIL.Image保存方式

logo_PIL.save('./logo_PIL_save.png')
logo_PIL_gray.save('./logo_PIL_gray_save.png')

图像保存正常

但是,即使都是同样格式,在不同的保存方式,图像的大小也不一样。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_leaf/article/details/79967291
文章标签: python opencv
上一篇Install OpenCv for python in Linux
下一篇Ubuntu 安装独立显卡后开机黑屏
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭