python 图片的读取、显示、处理与保存(PIL和OpenCV)

2023-11-15

0. 前言

先撇开matplotlib不谈,在python江湖用于读取图片的主要为两个门派,分别是PIL家族:

from PIL import Image

一个可用于python的图像处理库,PIL库提供通用的图像处理功能,以及基本图像操作,如图像缩放、裁剪、旋转、颜色转换等。

和cv2家族:

import cv2

OpenCV是一个开源的跨平台(Linux、Window、Android和Mac OS系统)计算机视觉库。OpenCV有C函数和少量C++类构成,主要接口是C++,同时还提供Python,Java等接口,有常用的图像处理函数,能够快速的实现一些图像处理和识别任务。

这两个家族虽然都能读取图片,但是使用的方法不相同。

1. 图片读取、显示和保存

  1. PIL
    from PIL import Image
    
    img = Image.open(r'./circle.png')
    """
    Image.open(fp, mode="r", formats=None)
    """
    print(type(img))  # <class 'PIL.PngImagePlugin.PngImageFile'>
    print(img.mode)  # RGBA,真彩+透明通道
    print(img.size)  # (1133, 865) (宽(列数), 高(行数))
    img.show()  # im.show的方式为win10自带的图像显示应用
    img.save("./pil.jpg")
    

    对于彩色图像,不管其格式是PNG,BMP还是JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。对于灰度图像,不管格式是PNG、BMP还是JPG,打开后,其模式是“L”。

  2. cv2
    import cv2
    img2 = cv2.imread(r'./circle.png')
    """
    cv2.imread(filename, flags=None)
    filename的取值:图片的路径
    flags的取值:
    cv2.IMREAD_COLOR:加载彩色图像。图像的任何透明度都将被忽略。这是默认标志。 flags=1
    cv2.IMREAD_GRAYSCALE:以灰度模式加载图像 flags=0
    cv2.IMREAD_UNCHANGED:加载包含Alpha通道的图像 flags=-1
    """
    print(type(img2))  # <class 'numpy.ndarray'>
    print(img2.shape)  # (865, 1133, 3) (高(行数), 宽(列数), 通道数)
    cv2.imshow('circle', img2)
    cv2.waitKey(0)  # 表示“暂停程序,等待一个按键输入”!也就是说,当程序执行到waitKey(0);时,
                    # 程序被暂停运行,只有当你输入一个按键时,它才会继续运行。
                    # 相当于暂停,不加入这句图片将一闪而过
    cv2.destroyAllWindows()
    cv2.imwrite('./img.png', img)
    
    

两者差异

差异 PIL cv2 备注
读取类型 <class ‘PIL.PngImagePlugin.PngImageFile’> <class ‘numpy.ndarray’> PIL并不会真正读取文件,而cv2把整个图片读取为数组。
读取模式 RGBA BGR 颜色通道顺序不同,因此如果PIL读取的图片转换成矩阵,直接用cv2显示颜色会变得诡异
读取尺寸 (宽(列数), 高(行数), 通道数) (高(行数), 宽(列数), 通道数) 高和宽是相反的

2. PIL与cv2相互转换

PIL转换为cv2

pil2cv2 = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

感觉是先把PIL的读取类型转换为矩阵,然后切换颜色通道顺序。完整代码:

from PIL import Image
import cv2
import numpy as np

img = Image.open(r'./circle.png')
"""
Image.open(fp, mode="r", formats=None)
"""
print(type(img))  # <class 'PIL.PngImagePlugin.PngImageFile'>
print(img.mode)  # RGBA,真彩+透明通道
print(img.size)  # (1133, 865) (宽(列数), 高(行数))
#---------------修改部分--------------------
pil2cv2 = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
cv2.imshow('pil2cv2', pil2cv2)
cv2.waitKey(0)  # 表示“暂停程序,等待一个按键输入”!也就是说,当程序执行到waitKey(0);时,
                # 程序被暂停运行,只有当你输入一个按键时,它才会继续运行。
cv2.destroyAllWindows()
#-----------------------------------------

cv2转换为PIL

cv22pil = Image.fromarray(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))

通道的转换,再转换成PIL的图片类型。完整代码:

from PIL import Image
import cv2
img2 = cv2.imread(r'./circle.png')
"""
cv2.imread(filename, flags=None)
flags的取值:
cv2.IMREAD_COLOR:加载彩色图像。图像的任何透明度都将被忽略。这是默认标志。 flags=1
cv2.IMREAD_GRAYSCALE:以灰度模式加载图像 flags=0
cv2.IMREAD_UNCHANGED:加载包含Alpha通道的图像 flags=-1a
"""
print(type(img2))  # <class 'numpy.ndarray'>
print(img2.shape)  # (865, 1133, 3) (高(行数), 宽(列数), 通道数)
#---------------修改部分--------------------
cv22pil = Image.fromarray(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
cv22pil.show()
#------------------------------------------

在知乎上看见大佬对PIL和cv2这两个门派的比较,PIL形容为小船,cv2形容为航空母舰,PIL和cv2的其他知识可以参考“参考链接”的前四个。

3. 处理与保存

以下对图像的处理方式是用OpenCV的,根据自己经历过的情况,分为以下几个:

  1. 裁剪(手动、自动)

  2. 绘制矩形

3.1 裁剪

在裁剪之前要说明:一张图片左上角视为坐标原点,从原点水平向右视为x轴方向,从原点垂直向下视为y轴方向。
对图片的裁剪方式可以分为手动裁剪和自动裁剪,手动裁剪就是在图片上手动绘制一个矩形框作为裁剪的区域。
强烈安利:详解Python+opencv裁剪/截取图片的几种方式,讲得很清楚,我下面是把代码简化,留下最必须的函数。
手动裁剪用到的函数为selectROI:

roi = selectROI(windowName, img, showCrosshair=None, fromCenter=None):
. 参数windowName:选择的区域被显示在的窗口的名字
. 参数img:要在什么图片上选择ROI
. 参数showCrosshair:是否在矩形框里画十字线.
. 参数fromCenter:是否是从矩形框的中心开始画
. 返回值roi:是一个元组(x轴坐标,y轴坐标,宽度,高度),值为0无效

完整代码:

import cv2

img = cv2.imread(r'./circle.png')
roi = cv2.selectROI(windowName="circle", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
crop = img[y: y + h, x: x + w]
cv2.imwrite(r'./crop.jpg', crop) # 在当前目录下储存截取的图片

自动裁剪用到的im[ymin:ymax,xmin:xmax]:

im = cv2.imread(file_path)  # 读取文件
im = im[190:380,180:260]  # 裁剪。其值不能为0
cv2.imwrite(save_path_file,im) # 存储

完整代码:

import cv2

img = cv2.imread(r'./circle.png')
crop = img[100:200, 100: 250]
cv2.imwrite(r'./crop.jpg', crop) # 在当前目录下储存截取的图片

运行结果:
在这里插入图片描述
以下是原图,即circle.png:
在这里插入图片描述

3.2 绘制矩形

近期还没遇到,等遇到了再补上。

参考链接

OpenCV和PIL图像处理的差异小总结(比较详细介绍了尺寸差异和通道转换)
Python中Opencv和PIL.Image读取图片的差异对比
python用PIL/cv2读取存储图片
cv2与PIL的一点不同

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 图片的读取、显示、处理与保存(PIL和OpenCV) 的相关文章

随机推荐

  • yarn install命令运行报错:无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    PS C Users wangting Desktop vue vben admin main vue vben admin main gt yarn install yarn 无法将 yarn 项识别为 cmdlet 函数 脚本文件或可运
  • 设计模式之状态模式

    一 什么是状态模式 状态模式 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了这个类 二 什么时候使用状态模式 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况 把状态的判断逻辑转移到表示不同状态的一
  • 浅析vue中computed,method,watch,watchEffect的区别

    方法methods只要调用每次都会执行 watch 惰性 只有依赖项更新才会执行回调函数 且组件初次渲染不会执行 watchEffect 自动追踪依赖变化 只要依赖更新即执行回调函数 且组件初次渲染即执行回调函数 computed 惰性 返
  • 用python语言编写无人机的ros通信程序

    编写无人机的ROS通信程序 需要熟练掌握Python语言和ROS Robot Operating System 框架 首先 需要安装ROS和相关的工具包 并对ROS的基本概念和框架有所了解 其次 可以利用ROS中的Python客户端库 如r
  • Python Web:ls命令选项

    Python Web篇学习汇总 Python Web 操作系统与虚拟机软件 Python Web 了解Ubuntu操作系统 Python Web Linux查看 切换目录命令 Python Web 绝对路径和相对路径 Python Web
  • Python 学习笔记(1):心历路程,print()函数,变量和赋值

    也不知道从什么时候开始 对python这个语言有兴趣了 可能是公众号 广告推给我的吧 对python这个语言的印象不错 哈哈 之前大学的时候 对编程就比较感兴趣 反应也还可以 但毕竟不是专门学的 能力不够 毕业之后从事了与专业不相关的工作
  • spss聚类分析_系统聚类分析(操作)

    在前文系统聚类的理论分析基础上 下面来介绍系统聚类在SPSS中的操作和应用 在SPSS中系统聚类有两种类型 分别是Q型聚类和R型聚类 Q型聚类是对观测样本进行聚类 它使具有相似特征的观测样本聚集在一起 使差异性大的观测样本分离开来 R型聚类
  • 在linux下如何显示隐藏文件

    显示所有文件 包含隐藏文件 ls a 只显示隐藏文件l 或者ls d 在XWindow的KDE桌面中在 查看 View 菜单里选 显示隐藏文件 Show Hidden Files 就行了
  • 注意力机制(SE, ECA, CBAM, SKNet, scSE, Non-Local, GCNet, ASFF) Pytorch代码

    注意力机制 1 SENet 2 ECANet 3 CBAM 3 1 通道注意力 3 2 空间注意力 3 3 CBAM 4 展示网络层具体信息 5 SKNet 6 scSE 7 Non Local Net 8 GCNet 9 ASFF 10
  • uniapp h5或者公众号图片 安卓显示 ios不显示的问题

    如果你的接口前缀是https的 后台返回的图片地址前缀是http的 那么就一个解决办法 那就是把后台返回的图片地址前缀改成https 简单粗暴亲测有效
  • 初识Jena

    目录 前言 ApacheJena Or Neo4j Jena的安装和简介 从MySql转换数据到RDF RDF加载laod到Fuseki Fuseki的使用 遇到的问题 个人总结 其他 参考文献 前言 一个机器人问答系统的核心我认为包括两大
  • 给虚拟机换背景图片

    首先在桌面右键 选择 change background 在backgroud这里 点击右边的backgroud 因为我已经换好了 所以是这样 然后点击pictures就可以看到自己准备的图片了 直接把图片拖到虚拟机上的文件夹里就可以了 选
  • 【JMeter】 二次开发插件开发 Dubbo 接口测试插件浅析

    概述 在一些企业中 各类业务系统非常丰富 相互之间或对外提供很多的服务或接口 这些服务或接口中 有很多是需要强契约约束的 服务的提供方 服务的使用方必须遵守相同契约 这类服务最典型的就是RPC 其中应用广泛的有Dubbo gRPC等 使用J
  • 利用逆矩阵解线性方程组_经典Jacobi方法用于求解矩阵特征值

    1 引言 求解线性方程组在许多领域中都有重要应用 写成矩阵的形式 求解 可以写成 这里需要求解矩阵 的逆 线性代数 中给出的方法主要有两类 1 设置增广矩阵 利用高斯消元法 通过初等行列变换可以求 但这种方法不利于使用计算机计算 2 利用矩
  • Bootstarp入门教程(2) 概述

    概述 深入了解Bootstrap底层结构的关键部分 包括我们让web开发变得更好 更快 更强壮的最佳实践 1 HTML5文档类型 Bootstrap使用到的某些HTML元素和CSS属性需要将页面设置为HTML5文档类型
  • 【git】git compare with branch 一样的代码 但是却标识不一样 成块显示 Git 比较 不准确

    文章目录 1 概述 本文地址 https blog csdn net qq 21383435 article details 119483593 1 概述 我一个flink项目做git比较 用flink 1 9版本的对比1 13版本的 发现
  • Go_配置系统环境MacOS(M1)

    在MacOS下和JDK一样 配不配环境其实MacOS都是可以检测的到的 安装好以后直接输入go version是一样可以的 因为都是使用开发工具的 在开发工具里配置的话是样的 如果有习惯的话就配置一下吧 下载安装及配置环境 1 官网下载 h
  • 基于QT开发的跨平台文件校验工具

    QtFileHash QtFileHash是一款基于Qt开发的跨平台文件校验工具 支持Windows Linux MacOS平台 支持MD4 MD5 SHA1 SHA256 SHA512算法 项目地址 https github com zd
  • Linux下共享文件夹的位置在哪

    大家都知道vm这个虚拟机有个共享文件夹的功能 怎么设置这个共享文件夹在图示位置 但问题是在虚拟机里面这个文件夹的位置在哪里呢 我上网找了半天也没有解决方案 这里直接告诉大家 应该是被隐藏了但是我用 ls al看也没有 直接在用户 unbun
  • python 图片的读取、显示、处理与保存(PIL和OpenCV)

    目录 0 前言 1 图片读取 显示和保存 2 PIL与cv2相互转换 3 处理与保存 3 1 裁剪 3 2 绘制矩形 参考链接 0 前言 先撇开matplotlib不谈 在python江湖用于读取图片的主要为两个门派 分别是PIL家族 fr