您现在的位置是:首页 > 数码 > 

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

2025-07-22 07:23:40
python 图片的读取、显示、处理与保存(PIL和OpenCV) 目录0. 前言1. 图片读取、显示和保存2. PIL与cv2相互转换. 处理与保存.1 裁剪.2 绘制矩形参考链接 0. 前言 先撇开matplotlib不谈,在python江湖用于读取图片的主要为两个门派,分别是PIL家族: from PIL import Image

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

目录
  • 0. 前言
  • 1. 图片读取、显示和保存
  • 2. PIL与cv2相互转换
  • . 处理与保存
    • .1 裁剪
    • .2 绘制矩形
  • 参考链接

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 Imageimg = (r	./circle.png	)
    
    (fp, mode=r, formats=one)
    
    print(type(img))  # <class 	PIL.PngImagePlugin.PngImageFile	>
    print()  # RGBA,真彩透明通道
    print(img.size)  # (11, 865) (宽(列数), 高(行数))
    img.show()  # im.show的方式为win10自带的图像显示应用
    img.save(./pil.jpg)
    

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

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

两者差异

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

2. PIL与cv2相互转换

PIL转换为cv2

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

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

from PIL import Image
import cv2
import numpy as npimg = (r	./circle.png	)

(fp, mode=r, formats=one)

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

cv2转换为PIL

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

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

from PIL import Image
import cv2
img2 = cv2.imread(r	./circle.png	)

cv2.imread(filename, flags=one)
flags的取值:
cv2.IMREAD_COLOR:加载彩图像。图像的任何透明度都将被忽略。这是默认标志。 flags=1
cv2.IMREAD_GRAYSCALE:以灰度模式加载图像 flags=0
cv2.IMREAD_UCHAGED:加载包含Alpha通道的图像 flags=-1a

print(type(img2))  # <class 		>
print(img2.shape)  # (865, 11, ) (高(行数), 宽(列数), 通道数)
#---------------修改部分--------------------
cv22pil = Image.fromarray((img2, cv2.COLOR_BGR2RGB))
cv22pil.show()
#------------------------------------------

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

. 处理与保存

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

  1. 裁剪(手动、自动)

  2. 绘制矩形

.1 裁剪

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

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

完整代码:

import cv2img = cv2.imread(r	./circle.png	)
roi = cv2.selectROI(windowame=circle, img=img, showCroair=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:80,180:260]  # 裁剪。其值不能为0
cv2.imwrite(save_path_file,im) # 存储

完整代码:

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

运行结果:

以下是原图,即circle.png:

.2 绘制矩形

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

参考链接

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

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/805377.html

相关标签:无
上传时间: 2024-01-17 23:01:11
留言与评论(共有 17 条评论)
本站网友 潮州电信宽带
24分钟前 发表
cv2.COLOR_BGR2RGB)) cv22pil.show() #------------------------------------------ 在知乎上看见大佬对PIL和cv2这两个门派的比较,PIL形容为小船,cv2形容为航空母舰,PIL和cv2的其他知识可以参考“参考链接”的前四个
本站网友 山东现代职业学院招聘
7分钟前 发表
flags=one) flags的取值: cv2.IMREAD_COLOR:加载彩图像
本站网友 验房标准
22分钟前 发表
手动裁剪用到的函数为selectROI: roi = selectROI(windowame
本站网友 玲珑混沌官网
9分钟前 发表
处理与保存(PIL和OpenCV) 目录0. 前言1. 图片读取
本站网友 上拉电阻
23分钟前 发表
图像的任何透明度都将被忽略
本站网友 房地产交易网
11分钟前 发表
250] cv2.imwrite(r ./crop.jpg
本站网友 相约黄昏
16分钟前 发表
img) 两者差异 差异PILcv2备注读取类型<class ‘PIL.PngImagePlugin.PngImageFile’><class ‘’>PIL并不会真正读取文件,而cv2把整个图片读取为数组
本站网友 奶粉1段
29分钟前 发表
cv2.COLOR_RGB2BGR) cv2.imshow( pil2cv2
本站网友 深圳大学专业排名
4分钟前 发表
图像的任何透明度都将被忽略
本站网友 北京胎记医院
0秒前 发表
crop) # 在当前目录下储存截取的图片 自动裁剪用到的im[ymin
本站网友 青岛事故车交易网
12分钟前 发表
处理与保存(PIL和OpenCV) 目录0. 前言1. 图片读取
本站网友 绿地老街坊
26分钟前 发表
showCroair=True
本站网友 泰和家园
14分钟前 发表
260] # 裁剪
本站网友 孙淳电视剧
8分钟前 发表
200
本站网友 上海万科兰乔圣菲
29分钟前 发表
cv2.COLOR_BGR2RGB)) cv22pil.show() #------------------------------------------ 在知乎上看见大佬对PIL和cv2这两个门派的比较,PIL形容为小船,cv2形容为航空母舰,PIL和cv2的其他知识可以参考“参考链接”的前四个
本站网友 坦洲二手房
4分钟前 发表
crop) # 在当前目录下储存截取的图片 自动裁剪用到的im[ymin