opencv、pillow和matplotlib的区别

news2024/11/26 23:36:07

考文章:Python学习小技巧——opencv、pillow和matplotlib的区别_pillow和opencv区别-CSDN博客

1 概念的比较:

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

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

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

英文可以用OpenCV直接在画面上显示,中文需要Pillow去写字

2 OpenCV处理图片

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)

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

 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处理图片

读、写以及展示图片等操作
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

输出结果如图示:

 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处理图片

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)     # 保存图片

输出结果如图示:

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 opencv、pillow和matplotlib相互转换 

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读取图片的图片数据

输出结果如图示:

 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)

输出结果如图示:

 

 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读取灰度图的图片数据

输出结果如图示:

6 总结

三者转换的时候,转换的是数据类型和通道顺序。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【uniapp小程序-上拉加载】

在需要上拉加载的页面的page.json上添加红框框里面的 onReachBottom() {if(this.commentCurrent<this.commentTotal){this.commentCurrent 1; this.commentList();this.status loading;}else{this.status ;} }, methods:{commentList(){let params {courseid:this.cour…

超级计算机与天气预报:精准预测的科技革命

超级计算机与天气预报&#xff1a;精准预测的科技革命 一、引言 随着科技的飞速发展&#xff0c;超级计算机已经成为现代社会不可或缺的一部分。它们在科研、工业、军事等领域发挥着重要作用&#xff0c;其中天气预报是一个颇具代表性的应用领域。本文将探讨超级计算机在天气…

_55跳跃游戏 _45跳跃游戏II

_55跳跃游戏 && _45跳跃游戏II 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;_55跳跃游戏_45跳跃游戏II 参考代码&#xff1a;_55跳跃游戏_45跳跃游戏II_从覆盖范围角度考虑_45跳跃游戏II 错误经验吸取 原题链接&#xff1a; _55跳跃游戏 &&…

文件包含的提升刷题

上一篇文章&#xff1a;一篇文章带你入门文件包含-CSDN博客 已经开始入门了文件包含&#xff0c;那现在开始拔高提升刷题&#xff01; 1. 拿到题目后啥也没有&#xff0c;所以也不知道要读取啥文件&#xff0c;那就查看源代码。 直接看if的条件就可以知道一定要设置cookie&a…

leecode题解Golang版本-3-无重复字符最长子串

题目 无重复字符最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 题解 func lengthOfLongestSubstring(s string) int {m : make(map[uint8]int)res : 0for l, r : 0, 0; r < len(s); r {m[s[r]]if v, ok : m[s[r]]; !ok || v 1…

「Verilog学习笔记」流水线乘法器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule multi_pipe#(parameter size 4 )(input clk , input rst_n ,input [size-1:0] mul_a ,input [size-1:0] mul_b ,output …

PyTorch官网demo解读——第一个神经网络(2)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;1&#xff09; 继上一篇文章我们展示了第一个神经网络的完整代码&#xff0c;今天我们来聊聊这个神经网络的模型设计。 这个demo实际上只使用了一个简单的线性模型&#xff1a;y wx b&#xff1b; 手写…

测试大佬详解:黑盒测试的底层逻辑

什么是黑盒测试&#xff1f; 它是把程序看作一个黑盒子&#xff0c;在不考虑程序内部结构的情况下&#xff0c;检查程序功能是否按照PRD的规定正常使用&#xff0c;程序是否能适当地接收输入数据&#xff0c;产生正确的输出。 这其实就是黑盒测试的定义&#xff0c;也是黑盒测…

Linux---Ubuntu软件安装

1. 软件安装的介绍 Ubuntu软件安装有两种方式: 离线安装(deb文件格式安装&#xff09;在线安装(apt-get方式安装) 2. deb文件格式安装 是 Ubuntu 的安装包格式&#xff0c;可以使用 dpkg 命令进行软件的安装和卸载。 命令说明dpkg安装和卸载deb安装包 dpkg命令选项: 选项…

微服务——服务异步通讯(MQ高级)

MQ的一些常见问题 消息可靠性 生产者消息确认 返回ack&#xff0c;怎么感觉这么像某个tcp的3次握手。 使用资料提供的案例工程. 在图形化界面创建一个simple.queue的队列&#xff0c;虚拟机要和配置文件里面的一样。 SpringAMQP实现生产者确认 AMQP里面支持多种生产者确认的类…

数据库sql语句查询补充

数据库sql语句查询补充 0.前言1.Like谓语2.带有Having当中的分组查询eg. 例题:错题重做: 3.内连接例题 0.前言 数据库期末复习,对自己做错的题进行知识总结和梳理 1.Like谓语 like谓语主要有两个操作 %:百分号,表示任意长度的字符串_:下划线,表示任意单个字符 like谓语的语…

MySQL数据库,触发器、窗口函数、公用表表达式

触发器 触发器是由事件来触发某个操作&#xff08;也包含INSERT、UPDATE、DELECT事件&#xff09;&#xff0c;如果定义了触发程序&#xff0c;当数据库执行这些语句时&#xff0c;就相当于事件发生了&#xff0c;就会自动激发触发器执行相应的操作。 当对数据表中的数据执行…

AX7A200教程(9): ov5640摄像头输出显示720p视频

一&#xff0c;功能框图 ov5640摄像头视频通过ddr3缓存后&#xff0c;最后使用hdmi接口进行输出显示 二&#xff0c;摄像头硬件说明 2.1&#xff0c;像头硬件管脚 如下图所示&#xff0c;一共18个管脚 2.2&#xff0c;摄像头电源初始化时序 因这个ov5640摄像头是买的老摄像…

“去 Android化”为何蔚然成风?

早在2008年时&#xff0c;国内市场诞生了第一批自研手机OS&#xff0c;由于种种缘由铩羽而归&#xff0c;“优化Android ”貌似成为了本土特色。而从2023年下半年开始掀起了一股"去安卓化"的热潮&#xff0c;像华为、小米、vivo等都不约而同的站在了同一战线。 “去…

Kotlin Multiplatform的现状—2023年网络研讨会

Kotlin Multiplatform的现状—2023年网络研讨会 在2023年&#xff0c;Kotlin Multiplatform因其开发、当前状态和未来潜力而受到了相当大的关注。随着越来越多的开发者对采用KMP进行跨平台解决方案表示兴趣&#xff0c;JetBrains在11月下旬推出了一系列网络研讨会作为回应。首…

数字化转型三大证书推荐:TOGAF+ITIL4+DAMA

&#x1f308;数字化转型是企业发展的必经之路。通过数字化的手段&#xff0c;有效提升企业业务开展及内部运营的效率&#xff0c;利于企业的降本增效及流程再造。 目前关于数字化转型的培训学习越来越多&#xff0c;对于推动企业数字化转型起到了重要作用。 数字化转型三大证书…

css+html横向滚动+固定宽

没什么好说的&#xff0c;快上代码&#xff01; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Do…

滴灌广袤农村——建行江门市分行多维施策惠乡村

江门是全省农业大市、海洋大市&#xff0c;县域面积辽阔&#xff0c;约占全市95%&#xff0c;总人口和GDP约占7成左右&#xff0c;为建行江门市分行服务乡村振兴提供“沃土”。建行江门市分行以新金融行动贯彻新发展理念&#xff0c;主动作为&#xff0c;以数字技术赋能乡村振兴…

竞赛保研 python的搜索引擎系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

域名接入CloudFlare

接入Cloudflare分为两步 Cloudflare中注册站点域名DNS修改 整个过程如下 1.) 访问Cloudflare面板&#xff0c;添加站点 2.) 选择免费版 3.) 查看并明确DNS记录&#xff0c;其中服务的解析地址填写自己实际的服务器ip 4.) 去域名管理控制台&#xff0c;移除旧DNS服务器&#…