python 图片的读取、显示、处理与保存(PIL和OpenCV) 您所在的位置:网站首页 被踢一脚怎么处理最好呢图片 python 图片的读取、显示、处理与保存(PIL和OpenCV)

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

2024-07-10 08:41| 来源: 网络整理| 查看: 265

目录 0. 前言1. 图片读取、显示和保存2. PIL与cv2相互转换3. 处理与保存3.1 裁剪3.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. 图片读取、显示和保存 PILfrom PIL import Image img = Image.open(r'./circle.png') """ Image.open(fp, mode="r", formats=None) """ print(type(img)) # 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”。

cv2import 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)) # print(img2.shape) # (865, 1133, 3) (高(行数), 宽(列数), 通道数) cv2.imshow('circle', img2) cv2.waitKey(0) # 表示“暂停程序,等待一个按键输入”!也就是说,当程序执行到waitKey(0);时, # 程序被暂停运行,只有当你输入一个按键时,它才会继续运行。 # 相当于暂停,不加入这句图片将一闪而过 cv2.destroyAllWindows() cv2.imwrite('./img.png', img)

两者差异

差异PILcv2备注读取类型PIL并不会真正读取文件,而cv2把整个图片读取为数组。读取模式RGBABGR颜色通道顺序不同,因此如果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)) # 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)) # 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的,根据自己经历过的情况,分为以下几个:

裁剪(手动、自动)

绘制矩形

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的一点不同



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有