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

原创 2018年04月16日 21:54:21

对比: 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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_leaf/article/details/79967291

Python OpenCV 简单图像比较

项目需要做两张图像比较的差,感觉Python用起来很方便,手头正好有OpenCV。红绿代表插值正负,为了更好的可视化,差值均放大10倍显示。 import cv2 def clmap(v, k, ...
  • linian71
  • linian71
  • 2015-01-15 16:41:36
  • 2120

哈希算法实现图像相似度比较(Python&OpenCV)

简述相似图像搜索的哈希算法有三种: 均值哈希算法 差值哈希算法 感知哈希算法 均值哈希算法步骤 缩放:图片缩放为8*8,保留结构,出去细节。 灰度化:转换为256阶灰度图。 求平均值:计算灰度图所...
  • haofan_
  • haofan_
  • 2017-08-11 14:47:16
  • 4085

python opencv 使用 Matplotlib显示图像

05-python opencv 使用 Matplotlib显示图像 05-python opencv 使用 Matplotlib显示图像 概述 实现过程 引用 测试灰度图像 测试彩色图像 ...
  • huanglu_thu13
  • huanglu_thu13
  • 2016-08-27 16:33:32
  • 2393

python中利用opencv简单做图片比对

python环境中,利用opencv对二值单通道图片进行比对 下面代码中利用了两种比对的方法,一 对图片矩阵(m x m)求解特征值,通过比较特征值是否在一定的范围内,判断图片是否相同。二 对图片矩阵...
  • MyNameIsObama
  • MyNameIsObama
  • 2017-12-21 17:30:37
  • 468

Python中PILImage和Python转化

Python中PILImage和Python转化
  • wfei101
  • wfei101
  • 2017-12-09 09:53:28
  • 211

图像相似度算法的个人见解(python&opencv)

简述前段时间写了篇博文 哈希算法实现图像相似度比较(Python&OpenCV) ,使用简单的哈希算法进行图像相似度判断。但是在实践中该算法达不到预期的效果: 图像缩放8*8大小,图片信息内容严重丢失...
  • haofan_
  • haofan_
  • 2017-12-14 21:07:55
  • 4828

opencv3中SURF特征点检测-两幅图像进行比较

#include #include #include using namespace cv; using namespace std; int main() { Mat srcImage1 = ...
  • qq_23880193
  • qq_23880193
  • 2015-11-21 23:44:32
  • 3987

用openCV 和 Python 实现图片对比,并标识出不同点

最近项目中需要实现两组图片对比,并能将两者的区别标识出来。在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下:想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Pytho...
  • ibaymin
  • ibaymin
  • 2017-07-10 21:14:18
  • 741

matplotlib.pyplot与cv2、Image.open 读取图片显示的差异

简介 In the Python bindings of OpenCV, images are represented as NumPy arrays in BGR order. This wor...
  • u011463646
  • u011463646
  • 2017-08-20 15:48:32
  • 2180

使用OpenCV实现实时图像对比

  • 2017年02月22日 14:10
  • 1.2MB
  • 下载
收藏助手
不良信息举报
您举报文章:Python图像对比: opencv matplotlib.pyplot PIL.Image
举报原因:
原因补充:

(最多只允许输入30个字)