python中cv2、Image和plt的图片打开、显示和保存

本文介绍了如何使用Python的cv2、Image和plt库来读取、显示和保存图片。通过示例代码展示了不同库之间的图片格式转换,并详细解释了各库在显示图片时的差异。此外,还提供了多张图片的显示方法,以及使用plt保存图片的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用cv2、Image、plt打开、显示和保存图片


0、读取图片

import cv2
from PIL import Image
import matplotlib.pyplot as plt

image_read_cv2 = cv2.imread('./cat.jpg', cv2.IMREAD_COLOR)  # 使用cv2打开图片
image_read_Image = Image.open('./cat.jpg')  # 使用Image打开图片

print(image_read_cv2.shape)
使用cv2打开的图片格式是:(1440, 2560, 3) [h, w, c]
通道顺序是BGR

print(image_read_Image.size)
使用Image打开的图片格式是:(2560, 1440) [w, h]
通道顺序是RGB

提炼知识点:cv2格式图片和Image格式图片格式互转

# cv2格式图片和Image格式图片格式互转 
# 1、cv2 --> Image 
image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) 
# 2、Image --> cv2 
image0 = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)

1、使用cv2显示cv2打开的图片

def cv2_show_cv_image(image):  # 使用cv2显示cv2打开的图片
    cv2.namedWindow('image', 0)  # 命名一个窗口
    cv2.resizeWindow('image', 600, 500)  # 将窗口大小进行调整,这两部主要是为了防止图片过大,屏幕显示不下
    cv2.imshow('image', image)  # 显示图片
    cv2.waitKey(0)  # 等待,按任意键跳过,如果没有这个,窗口会是一闪而过
    cv2.destroyWindow('image')  # 这个和下一句都是关闭窗口,只不过这是关闭指定窗口
    # cv2.destroyAllWindows()  # 关闭此时cv2所有打开的窗口
    # cv2.imwrite('cat.png', image)  # cv2保存图片

2、使用cv2显示Image打开的图片

def cv2_show_Image_image(image):
    image0 = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)  # 将Image格式的图片转成np进而转换成cv2格式
    cv2.namedWindow('image', 0)  # 命名一个窗口
    cv2.resizeWindow('image', 600, 500)  # 将窗口大小进行调整,这两部主要是为了防止图片过大,屏幕显示不下
    cv2.imshow('image', image0)  # 显示图片
    cv2.waitKey(0)  # 等待,按任意键跳过,如果没有这个,窗口会是一闪而过
    cv2.destroyWindow('image')  # 这个和下一句都是关闭窗口,只不过这是关闭指定窗口

3、使用Image显示Image打开的图片

def Image_show_Image_image(image:Image):
    image.show()
    # image.save('image.jpg')  # 保存

一般在dataset中使用Image进行处理

# 这个操作主要是为了保证将图片进行缩放后,保持原图的纵横比不变
image = image.resize((new_w, new_h), Image.BICUBIC)  # 对图片进行缩放
image_new = Image.new('F', size=(in_w, in_h), color=0)  # 创建一个新的蒙版
image_new.paste(image, (dx, dy))  # 将原画图粘贴到新的蒙版上

4、使用Image显示cv2打开的图片

这个应用场景可以是dataset加载时使用cv2先对图片进行预处理,再转换成Image格式,

def Image_show_cv2_image(image:cv2):
    image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))  # 把图片从cv2格式转换成Image
    image.show()

5、使用plt显示cv2打开的图片

# 使用plt显示cv2格式的图片
def plt_show_cv2_image(image):
    image0 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    plt.figure()  # 打开一个画布
    plt.axis('off')  # 不打开坐标轴
    plt.imshow(image0)
    plt.show()  # 加上这个才能显示
    # plt.pause(0.01)  # 暂时显示0.01秒
    # plt.draw()  # 重新绘制当前图形

6、使用plt显示Image格式的图片

# 使用plt显示Image格式的图片
def plt_show_Image_image(image:Image):
    plt.figure()
    plt.imshow(image)
    plt.show()

7、使用plt显示多张图片

def plt_show_multi_image(image1, image2):
    def plt_show_multi_image(image1, image2):
    fig = plt.figure(num=1)
    fig.tight_layout()  # 调整整参数使子图填充整个区域,不会出现字体重叠
    plt.subplot(121)  # 定位到第一个子图
    plt.imshow(image1)  # 第一个字图需要显示的图片

    plt.subplot(122)
    plt.imshow(image2)

    plt.show()  # 把画布显示出来
    

使用plt绘制图之后使用plt.savefig('cats.png') 保存图片

<think>嗯,用户的问题是关于如何在Python中使用matplotlib保存图片后,再次加载并进行二次编辑的图像处理。首先,我需要理解用户的具体需求。他们可能已经生成了一个图表,保存图片文件,现在想要重新打开这个图片进行修改,比如调整颜色、添加标注或者应用滤镜等。 首先,我应该考虑matplotlib保存图片通常是位图格式,比如PNG、JPG,或者是矢量图如PDF、SVG。用户提到的二次编辑可能涉及两种方式:一种是重新生成图表并修改代码,另一种是直接对保存图片文件进行处理。根据用户的问题,他们可能指的是后者,即直接处理已保存的图像文件,而不是重新生成图表。 接下来,我需要回忆如何用Python加载图像文件。常用的库有OpenCVcv2PIL(Pillow)。这两个库都可以读取图片文件并将其转换为数组,方便后续处理。需要注意的是,OpenCV默认读取的是BGR格式,而matplotlib使用RGB,所以在显示时可能需要转换颜色空间,避免颜色偏差,这一点在引用[3]中提到过。 然后,用户可能需要了解如何对加载后的图像进行二次编辑。例如,调整亮度、对比度,添加文本,或者应用滤波处理,比如中值滤波、高斯滤波等。引用[3]中的例子展示了使用不同滤波方法处理图像,这可能对用户有帮助。 另外,用户可能想知道如何保存修改后的图像。这可以通过OpenCVcv2.imwrite()或Pillow的Image.save()方法实现。需要提醒用户注意保存时的文件格式颜色通道是否正确。 我还需要考虑用户可能的误区。例如,直接编辑保存图片会丢失原始数据的矢量信息,尤其是如果是位图,放大可能导致失真。而如果是矢量图,如PDF或SVG,可能需要不同的处理方式,比如使用svgutils库来编辑SVG文件。但用户的问题可能更偏向于处理位图,所以重点应放在位图处理上。 最后,生成相关问题时要覆盖用户可能进一步想知道的内容,比如不同图像处理库的区别、颜色空间转换的重要性,或者如何应用特定的图像处理技术。</think>在Python中使用matplotlib保存图片后,可以通过以下两种方式实现二次编辑: ### 方法一:重新生成图像(推荐) 1. **保存原始数据**:建议在首次生成图像时保留数据数组绘图参数 2. **修改代码重新绘图**: ```python import matplotlib.pyplot as plt import numpy as np # 原始数据保存 x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) # 重新生成图像 plt.figure(figsize=(10,6)) plt.plot(x, y, color='blue') # 可修改线条颜色 plt.title("修改后的标题") # 修改标题 plt.savefig('modified_figure.png') # 重新保存 ``` ### 方法二:直接编辑图像文件 1. **使用OpenCV读取/处理**: ```python import cv2 # 读取保存图片 img = cv2.imread('original_figure.png') # 转换为RGB格式(OpenCV默认BGR格式) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 示例:添加红色文本 cv2.putText(img_rgb, '新增标注', (100,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 2) # 保存修改后的图像 cv2.imwrite('modified_image.png', cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR)) ``` 2. **使用Pillow处理**: ```python from PIL import Image, ImageDraw # 打开图像文件 img = Image.open('original_figure.png') # 创建绘图对象 draw = ImageDraw.Draw(img) # 添加绿色矩形 draw.rectangle([(50,50), (200,200)], outline=(0,255,0), width=3) # 保存修改 img.save('modified_with_pillow.png') ``` ### 注意事项: 1. 位图编辑会降低图像质量,建议优先选择矢量图格式(PDF/SVG) 2. 颜色空间转换至关重要,OpenCV使用BGR格式,matplotlib使用RGB格式[^3] 3. 对图像进行滤波处理时,可参考中值滤波、高斯滤波的实现方法 4. 修改文本标注时,位图方式无法修改原始文字内容,只能覆盖添加 ### 矢量图编辑示例(SVG格式): ```python # 保存时使用矢量格式 plt.savefig('figure.svg') # 使用svgutils修改 import svgutils.transform as sg fig = sg.fromfile('figure.svg') fig.append(sg.TextElement(100,100, '新增标注', size=12)) fig.save('modified_figure.svg') ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值