Python学习小技巧——opencv、pillow和matplotlib的区别

1 引言

在python的学习使用过程中,图像处理是非常常见的一个研究方向。opencv、pillow和matplotlib是python中对图片进行读、写以及展示等操作的较为常用的方法。虽然通过opencv、pillow和matplotlib处理图片的方式不同,但是之间可以转换使用。

2 opencv处理图片

2.1 opencv读、写以及展示图片等操作

import cv2

# opencv读、写以及展示图片等操作
image = cv2.imread(r"000000.jpg")                            # 读取图片
cv2.namedWindow('img1', cv2.WINDOW_NORMAL)                   # 建立名为img的窗口
cv2.imshow('img1', image)                                    # 在ing窗口展示图片
cv2.waitKey(2000)                                            # 2s后自动销毁
cv2.imwrite(r"1.png", image)                                 # 写入图片
GrayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)          # 灰度化
cv2.namedWindow('img2', cv2.WINDOW_NORMAL)
cv2.imshow('img2', GrayImage)
cv2.waitKey(2000)  
cv2.destroyAllWindows()                                      # 关闭全部窗口
cv2.imwrite(r"2.png", GrayImage)

输出结果如图示:
在这里插入图片描述

2.2 opencv读取图片的形状、大小、编码格式及数据类型等

import cv2

image = cv2.imread(r"000000.jpg")                       # 读取图片
GrayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)     # opencv读取图片默认为BGR格式,灰度化
print(image.shape)                                      # opencv读取图片的shape为高、宽、通道数
print(image.size)                                       # opencv读取图片的size为像素和
print(GrayImage.shape)                                  # opencv读取灰度图的shape为高、宽(通道数默认为1不显示)
print(GrayImage.size)                                   # opencv读取灰度图的size为像素和
print(image.dtype)                                      # opencv读取图片的编码格式
print(GrayImage.dtype)                                  # opencv读取灰度图的编码格式
print(type(image))                                      # opencv读取图片的数据类型
print(type(GrayImage))                                  # opencv读取灰度图的数据类型
# print(image)                                          # opencv读取图片的图片数据
# print(GrayImage)                                      # opencv读取灰度图的图片数据

输出结果如图示:
在这里插入图片描述

3 pillow处理图片

3.1 读、写以及展示图片等操作

from PIL import Image

# pillow读、写以及展示图片等操作
img = Image.open("000000.jpg").convert('RGB')     # pillow默认RGB格式
img.show()                                        # 展示图片
img.save("img1")                                  # 保存图片img1
Grayimg = Image.open("000000.jpg").convert('L')   # 灰度化
Grayimg.show()                                    # 展示图片
Grayimg.save("Grayimg1")                          # 保存图片Grayimg1

输出结果如图示:
在这里插入图片描述

3.2 pillow读取图片的宽高、数据类型及图片数据等

from PIL import Image

# pillow处理图片
img = Image.open("000000.jpg").convert('RGB')       # pillow默认RGB格式
Grayimg = Image.open("000000.jpg").convert('L')     # 灰度化
print(img.size)                                     # pillow读取图片的size为宽、高
print(Grayimg.size)                                 # pillow读取灰度图的size为宽、高
print(type(img))                                    # pillow读取图片的数据类型
print(type(Grayimg))                                # pillow读取灰度图的数据类型
print(img)                                          # pillow读取图片的图片数据
print(Grayimg)                                      # pillow读取灰度图的图片数据

输出结果如图示:
在这里插入图片描述

4 matplotlib处理图片

4.1 matplotlib读、写以及展示图片等操作

import matplotlib.pyplot as plt

# matplotlib读取图片
plt_img = plt.imread("000000.jpg")     # 读取图片
plt.imshow(plt_img)                    # 交互模式中imshow就显示了,脚本模式中要多加plt.show()
plt.show()                             # 展示图片
plt.imsave("plt_out.jpg", plt_img)     # 保存图片

输出结果如图示:
在这里插入图片描述

4.2 matplotlib读取图片的形状、大小、编码格式、数据类型等

import matplotlib.pyplot as plt

# matplotlib处理图片
plt_img = plt.imread("000000.jpg")     # 读取图片(默认RGB格式)
print(plt_img.shape)                   # matplotlib读取图片的shape为高、宽、通道数
print(plt_img.size)                    # matplotlib读取图片的size为像素和
print(plt_img.dtype)                   # matplotlib读取图片的编码格式
print(type(plt_img))                   # matplotlib读取图片的数据类型
# print(plt_img)                       # matplotlib读取图片的图片数据

输出结果如图示:
在这里插入图片描述

5 新建图像

5.1 Numpy创建图像

import cv2
import numpy as np
import os

# 创建彩色图像(RGB)
# (1) 通过宽度高度值创建多维数组
height, width, channels = 400, 300, 3                          # 行/高, 列/宽, 通道数
imgEmpty = np.empty((height, width, channels), np.uint8)       # 创建空白数组
imgBlack = np.zeros((height, width, channels), np.uint8)       # 创建黑色图像 RGB=0
imgWhite = np.ones((height, width, channels), np.uint8) * 255  # 创建白色图像 RGB=255
# (2) 创建相同形状的多维数组
img1 = cv2.imread("../images/imgLena.tif", flags=1)            # flags=1 读取彩色图像(BGR)
imgBlackLike = np.zeros_like(img1)                             # 创建与 img1 相同形状的黑色图像
imgWhiteLike = np.ones_like(img1) * 255                        # 创建与 img1 相同形状的白色图像
# (3) 创建彩色随机图像 RGB=random
randomByteArray = bytearray(os.urandom(height * width * channels))
flatNumpyArray = np.array(randomByteArray)
imgRGBRand = flatNumpyArray.reshape(height, width, channels)
# (4) 创建灰度图像
imgGrayWhite = np.ones((height, width), np.uint8) * 255        # 创建白色图像 Gray=255
imgGrayBlack = np.zeros((height, width), np.uint8)             # 创建黑色图像 Gray=0
imgGrayEye = np.eye(width)                                     # 创建对角线元素为1 的单位矩阵
randomByteArray = bytearray(os.urandom(height*width))
flatNumpyArray = np.array(randomByteArray)
imgGrayRand = flatNumpyArray.reshape(height, width)            # 创建灰度随机图像 Gray=random

print("Shape of image: gray {}, RGB {}".format(imgGrayRand.shape, imgRGBRand.shape))
cv2.imshow("DemoGray", imgGrayRand)                            # 在窗口显示 灰度随机图像
cv2.imshow("DemoRGB", imgRGBRand)                              # 在窗口显示 彩色随机图像
cv2.imshow("DemoBlack", imgBlack)                              # 在窗口显示 黑色图像
cv2.waitKey(2000)                                              # 等待按键命令
cv2.destroyAllWindows()

输出结果如图示:
在这里插入图片描述

5.2 pillow创建图像

import numpy as np
from PIL import Image

# pillow新建图片
img = Image.new('RGB', (400, 200), (128, 0, 0))     # RGB格式,(宽,高),(R,G,B)
img.show()                                          # 展示图片
img = np.array(img)                                 # 转为numpy格式
print(type(img))                                    # 图片的数据类型
print(img.dtype)                                    # 图片的编码格式
# print(img)                                        # 图片的图片数据

输出结果如图示:
在这里插入图片描述在这里插入图片描述

6 opencv、pillow和matplotlib相互转换

6.1 opencv转pillow

import cv2
from PIL import Image

# opencv转pillow(先转通道,再转类型)
image = cv2.imread(r"000000.jpg")                       # 读取图片
rgb_img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)        # 转通道
# cv2.COLOR_BGR2RGB 与 COLOR_RGB2BGR 都是4, 相当于
# rgb_img = cv_img[:, :, [2, 1, 0]]
print(image.shape)                                      # opencv读取图片的shape为高、宽、通道数
print(image.size)                                       # opencv读取图片的size为像素和
print(image.dtype)                                      # opencv读取图片的编码格式
print(type(image))                                      # opencv读取图片的数据类型
# print(image)                                          # opencv读取图片的图片数据
# print(GrayImage)                                      # opencv读取灰度图的图片数据
pil_img = Image.fromarray(rgb_img)                      # 转类型
# pil_img.show()
print(pil_img.size)                                     # pillow读取图片的size为宽、高
print(type(pil_img))                                    # pillow读取图片的数据类型
print(pil_img)                                          # pillow读取图片的图片数据

输出结果如图示:
在这里插入图片描述]

6.2 pillow转opencv

import cv2
import numpy as np
from PIL import Image

# pillow转opencv
pil_img = Image.open("000000.jpg").convert('RGB')       # pillow默认RGB格式
pil_np_img = np.array(pil_img)                          # 转为numpy格式
cv2.namedWindow('img1', cv2.WINDOW_NORMAL)
cv2.imshow('img1', pil_np_img)                          # opencv读取图片为BGR格式
cv2.waitKey(2000)                                       # 2s后自动销毁
cv2.destroyAllWindows()
print(pil_np_img.shape)
print(pil_np_img.size)
print(pil_np_img.dtype)
print(type(pil_np_img))
# print(pil_np_img)

输出结果如图示:
在这里插入图片描述
在这里插入图片描述

6.3 matplotlib转opencv

import cv2
import matplotlib.pyplot as plt

plt_img = plt.imread("000000.jpg")                       # 读取图片(默认RGB格式)
# plt.imshow(plt_img)
# plt.show()
print(plt_img.shape)                                     # matplotlib读取图片的shape为高、宽、通道数
print(plt_img.size)                                      # matplotlib读取图片的size为像素和
print(plt_img.dtype)                                     # matplotlib读取图片的编码格式
print(type(plt_img))                                     # matplotlib读取图片的数据类型
# print(plt_img)                                         # matplotlib读取图片的图片数据
img_cv = cv2.cvtColor(plt_img, cv2.COLOR_RGB2BGR)        # RGB转BGR
# cv2.imshow('img', img_cv)                              # 显示图片
cv2.waitKey(0)
cv2.destroyAllWindows()
GrayImage = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)     # opencv读取图片默认为BGR格式,灰度化
print(img_cv.shape)                                      # opencv读取图片的shape为高、宽、通道数
print(img_cv.size)                                       # opencv读取图片的size为像素和
print(GrayImage.shape)                                   # opencv读取灰度图的shape为高、宽(通道数默认为1不显示)
print(GrayImage.size)                                    # opencv读取灰度图的size为像素和
print(img_cv.dtype)                                      # opencv读取图片的编码格式
print(GrayImage.dtype)                                   # opencv读取灰度图的编码格式
print(type(img_cv))                                      # opencv读取图片的数据类型
print(type(GrayImage))                                   # opencv读取灰度图的数据类型
# print(image)                                           # opencv读取图片的图片数据
# print(GrayImage)                                       # opencv读取灰度图的图片数据

输出结果如图示:
在这里插入图片描述

7 总结

7.1 opencv

(1)默认不支持中文文件名
(2)数据为numpy,维度:高,宽,通道数,通道序:BGR
(3)显示完后要cv2.destroyAllWindows()
(4)读取图片时与pillow速度差不多

7.2 pillow

(1)python原生支持最好,各种操作都很方便,pytorch内部使用的就是pillow
(2)读入的是一个Image类,size的顺序:宽,高,通道序RGB
(3)保存图片时比opencv快
(4)在大量图片数据读写时可以优先考虑pillow

7.3 matplotlib

(1)读入数据格式最为便准,numpy格式,维度:高,宽,通道数,通道序:RGB
(2)交互模式中只要用plt.imshow()就直接显示图片了,脚本模式中要多加一句plt.show()
(3)opencv转matplotlib时rgb_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
(4)可以制作坐标图

如有错误,还请指正。
参考链接:
https://zhuanlan.zhihu.com/p/397330093
https://zhuanlan.zhihu.com/p/128433689
https://blog.csdn.net/ayiya_Oese/article/details/121692342

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值