无损保存和Matplotlib

了解常用图片格式和OpenCV高质量保存图片的方式,

学习如何使用Matplotlib显示OpenCV图像

目录

无损保存

常用图片格式

bmp

jpg

png

高质量保存

Matplotlib

显示灰度图

显示彩色图

加载和保存图片


无损保存

事实上,我们日常看到的大部分图片都是压缩过的,那么都有哪些常见的图片格式呢?

常用图片格式

bmp

全称:Bitmap

不压缩

jpg

全称:Joint Photographic Experts Group

有损压缩方式

png

全称:Portable Network Graphics

无损压缩方式

同一个文件保存成不同的格式后,文件大小上bmp肯定是最大的,

而png和jpg,不同的压缩比结果会有所不同

 

高质量保存

cv2.imwrite()保存图片时,可以传入第三个参数,用于控制保存质量:

cv2.IMWRITE_JPEG_QUALITY:jpg质量控制,取值0~100,值越大,质量越好,默认为95

cv2.IMWRITE_PNG_COMPRESSION:png质量控制,取值0~9,值越大,压缩比越高,默认为1

还有诸如CV_IMWRITE_WEBP_QUALITY的参量,不常用,需参考:ImwriteFlags

举例来说,原图lena.jpg的分辨率是350×350,大小49.7KB

把它转成不同格式:

 

import cv2

new_img = cv2.imread('lena.jpg')

# bmp
cv2.imwrite('img_bmp.bmp',new_img) # 文件大小:359KB

# jpg 默认95%质量
cv2.imwrite('img_jpg95.jpg',new_img) # 文件大小:52.3KB
# jpg 20%质量
cv2.imwrite('img_jpg20.jpg',new_img,[int(cv2.IMWRITE_JPEG_QUALITY),20]) # 文件大小:8.01KB
# jpg 100%质量
cv2.imwrite('img_jpg100.jpg',new_img,[int(cv2.IMWRITE_JPEG_QUALITY),100]) # 文件大小:82.5KB

# png 默认1压缩比
cv2.imwrite('img_png1.png',new_img) # 文件大小:240KB
# png 9压缩比
cv2.imwrite('img_png9.png',new_img,[int(cv2.IMWRITE_PNG_COMPRESSION),9]) # 文件大小:207KB

可以看到:

bmp文件是最大的,没有任何压缩

(1个像素点1byte,3通道的彩色图总大小:350×350×3/1024 ≈ 359 KB)

jpg/png本身就有压缩的,所以就算是100%的质量保存,体积也比bmp小很多

jpg的容量优势很明显,这也是它为什么如此流行的原因

问:为什么原图49.7KB,保存成bmp或其他格式反而大了呢? 

答:这里需要明确的是,保存新格式时,

容量大小跟原图的容量没有直接关系,

而是取决于原图的分辨率大小和原图本身的内容(压缩方式)

所以lena.jpg保存成不压缩的bmp格式时,容量大小就是固定的350×350×3/1024 ≈ 359 KB;

另外,容量变大不代表画质提升

 

Matplotlib

Matplotlib是Python的一个很常用的绘图库,可去官网学习更多内容

显示灰度图

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('lena.jpg', 0)

# 灰度图显示,cmap(color map)设置为gray
plt.imshow(img, cmap='gray')
plt.show()

 

 

显示彩色图

OpenCV中的图像是以BGR的通道顺序存储的

但Matplotlib是以RGB模式显示的,

所以直接在Matplotlib中显示OpenCV图像会出现问题,因此需要转换一下:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('lena.jpg')
img2 = img[:, :, ::-1]
# 或使用
# img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 显示不正确的图
plt.subplot(121),plt.imshow(img) 

# 显示正确的图
plt.subplot(122)
plt.xticks([]), plt.yticks([]) # 隐藏x和y轴
plt.imshow(img2)

plt.show()

img[:,:,0]表示图片的蓝色通道

img[:,:,::-1]就表示BGR翻转,变成RGB,说明一下:

熟悉Python应该知道,对一个字符串s翻转可以这样写:s[::-1],'abc'变成'cba',-1表示逆序

图片是二维的,所以完整地复制一副图像就是:

img2 = img[:,:] # 写全就是:img2 = img[0:height,0:width]

而图片是有三个通道,相当于一个长度为3的字符串,所以通道翻转与图片复制组合起来便是img[:,:,::-1]

结果如下:

 

加载和保存图片

不使用OpenCV,Matplotlib也可加载和保存图片:

import matplotlib.image as pli

img = pli.imread('lena.jpg')
plt.imshow(img)

# 保存图片,需放在show()函数之前
plt.savefig('lena2.jpg')
plt.show()

 

 

 

<think>好的,我现在需要解决用户的问题:如何在Matplotlib中设置保存图像的不同格式。首先,我应该回忆一下Matplotlib的相关知识,特别是关于保存图像的部分。 用户提到他们知道Matplotlib可以保存多种格式,但想了解具体如何指定格式。我记得`savefig`函数有一个`format`参数,可以直接指定文件扩展名,比如'png'、'pdf'等。比如,`plt.savefig('plot.png', format='png')`。不过,可能即使不显式指定format参数,Matplotlib也会根据文件名中的扩展名自动判断格式,比如保存为'plot.jpg'就会存成JPEG格式。这一点需要确认是否正确。 然后,用户可能需要一些具体的例子,比如如何保存为PNG、JPEG、SVG、PDF、TIFF等不同格式。需要给出每种格式的代码示例,并说明注意事项。例如,JPEG可能不支持透明背景,而PNG支持。同时,TIFF格式可能需要安装额外的库,比如Pillow,用户可能需要注意这一点。 接下来,用户可能关心如何同时设置格式其他参数,比如分辨率(dpi)、图像大小、压缩质量等。比如,保存JPEG时可以指定质量参数,或者TIFF的压缩方式。需要检查这些参数是否在`savefig`中可用,或者是否需要通过其他方式设置。 另外,引用中提到的内容需要整合进去。例如,引用[1]提到支持多种格式,引用[2][3]、[4]提到保存为TIFF、设置分辨率图像大小。所以在回答中需要结合这些引用,说明如何设置不同的格式以及相关参数。 还需要考虑用户可能遇到的问题,比如保存格式不支持,或者参数设置错误。例如,如果没有安装Pillow,保存TIFF可能会出错,这时候需要提示用户安装必要的库。 最后,生成相关问题,比如如何调整图像大小、如何设置分辨率、不同格式的优缺点等,帮助用户进一步了解相关知识。 总结步骤: 1. 介绍使用`savefig`函数的`format`参数或文件名扩展名来指定格式。 2. 提供不同格式的代码示例,并说明注意事项。 3. 结合引用中的信息,说明如何设置分辨率、图像大小等。 4. 提到可能需要安装额外库的情况(如TIFF需要Pillow)。 5. 生成相关问题,引导用户深入了解更多内容。 需要确保所有代码示例正确,并且语法正确。同时,使用中文回答,结构清晰,分步骤说明。</think>要使用Matplotlib指定保存图像的格式,可以通过`savefig()`函数的`format`参数或文件名后缀来设置。以下是具体方法及示例: --- ### **方法1:通过文件名后缀自动识别** 直接在文件名中包含扩展名,Matplotlib会自动识别格式: ```python plt.plot([1, 2, 3], [4, 5, 6]) plt.savefig('plot.png') # 保存为PNG plt.savefig('output.pdf') # 保存为PDF ``` --- ### **方法2:显式指定`format`参数** 使用`format`参数直接声明格式(优先级高于文件名后缀): ```python plt.savefig('image', format='jpeg', dpi=300) # 保存为JPEG,分辨率为300dpi ``` --- ### **常见图像格式设置示例** | 格式 | 代码示例 | 注意事项 | |--------|-----------------------------------|-----------------------------------| | PNG | `plt.savefig('plot.png')` | 支持透明背景,无损压缩[^1] | | JPEG | `plt.savefig('photo.jpg', quality=90)` | 需设置`quality`(0-100)[^3] | | PDF | `plt.savefig('diagram.pdf')` | 矢量图,适合打印缩放 | | SVG | `plt.savefig('graph.svg')` | 矢量图,可编辑 | | TIFF | `plt.savefig('data.tiff')` | 需安装Pillow库,支持压缩[^2] | --- ### **关键参数说明** 1. **分辨率设置** ```python plt.savefig('plot.png', dpi=600) # 设置600dpi分辨率 ``` 2. **图像大小控制** ```python plt.figure(figsize=(8, 6)) # 设置图像尺寸为8x6英寸 plt.savefig('plot.png') ``` 3. **背景透明性** ```python plt.savefig('plot.png', transparent=True) # 透明背景 ``` --- ### **注意事项** - **TIFF格式依赖**:保存TIFF需安装`Pillow`库,否则会报错。 - **矢量图格式**:PDF/SVG适合学术论文,可无限缩放不失真。 - **压缩与质量**:JPEG通过`quality`参数控制压缩率(默认75),TIFF通过`compression`参数设置压缩算法[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值