Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Python中关于图片的操作

2021/12/26 机器学习 Python
Word count: 998 | Reading time: 5min

写代码的时候一直记错库下对应的图片操作函数名以及他们的返回值类型,干脆写个笔记记录下。

图片读取相关的包:

  • matplotlib
  • PIL/
  • cv2
  • numpy

读取

matplotlib.pyplot / pylab

1
2
3
4
5
6
7
8
import pylab as plt
# from matplotlib import pyplot as plt
import numpy as np
img = plt.imread('examples.png')
print(type(img), img.dtype, np.min(img), np.max(img))

[out]
(<type 'numpy.ndarray'>, dtype('float32'), 0.0, 1.0) # matplotlib读取进来的图片是float,0-1

注:pylab和pyplot区别:前者将numpy、以及各个功能函数导入了其命名空间中。这样会使pylab表现的和matlab更加相似。现在来说我们经常使用pyplot,因为pyplot相比pylab更加纯粹。

PIL.image.open

1
2
3
4
5
6
7
8
9
10
from PIL import Image
import numpy as np
img = Image.open('examples.png')
print(type(img), np.min(img), np.max(img))
img = np.array(img) # 将PIL格式图片转为numpy格式
print(type(img), img.dtype, np.min(img), np.max(img))

[out]
(<class 'PIL.PngImagePlugin.PngImageFile'>, 0, 255) # 注意,PIL是有自己的数据结构的,但是可以转换成numpy数组
(<type 'numpy.ndarray'>, dtype('uint8'), 0, 255) # 和用matplotlib读取不同,PIL和matlab相同,读进来图片和其存储在硬盘的样子是一样的,uint8,0-255

PIL读取的结果是Image格式的,需要再额外转换成np.array的形式

cv2.imread

1
2
3
4
5
6
7
8
9
10
11
12
import cv2
import numpy as np
img = cv2.imread('examples.png') # 默认是读入为彩色图,即使原图是灰度图也会复制成三个相同的通道变成彩色图
img_gray = cv2.imread('examples.png', 0) # 第二个参数为0的时候读入为灰度图,即使原图是彩色图也会转成灰度图
print(type(img), img.dtype, np.min(img), np.max(img))
print(img.shape)
print(img_gray.shape)

[out]
(<type 'numpy.ndarray'>, dtype('uint8'), 0, 255) # opencv读进来的是numpy数组,类型是uint8,0-255
(824, 987, 3) # 彩色图3通道
(824, 987) # 灰度图单通道

注意,pylab.imread和PIL.Image.open读入的都是RBG顺序,而cv2.imread读入的是BGR顺序,混合使用的时候要特备注意

保存

plt.savefig()

savefig()方法用于保存绘制数据后创建的图形。使用此方法可以将创建的图形保存到我们的本地计算机中。

1
2
3
4
5
6
7
8
wordcloud = WordCloud(font_path=ciyunfont_path, mask=background_image, background_color='white').generate(cut_text)
plt.figure(figsize=(8, 8))
if not os.path.exists(result_path):
os.makedirs(result_path)
# 保存生成图片
plt.savefig(f'{result_path}/ciyun.png')
# 指定词云图为待显示的图片
plt.imshow(wordcloud, interpolation="bilinear")

注意, 使用savefig的话得注意与plt.show()的位置,如果先plt.show()了则保存的是空白图片。

PIL.image - 保存PIL格式的图片

1
2
3
4
5
from PIL import Image
img = Image.open('examples.png')
img.save('examples2.png')
img_gray = img.convert('L')
img_gray.save('examples_gray.png') # 不管是灰度还是彩色,直接用save函数保存就可以,但注意,只有PIL格式的图片能够用save函数

cv2.imwrite

1
2
3
4
5
import cv2
img = cv2.imread('examples.png') # 这是BGR图片
cv2.imwrite('examples2.png', img) # 这里也应该用BGR图片保存,这里要非常注意,因为用pylab或PIL读入的图片都是RGB的,如果要用opencv存图片就必须做一个转换
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite('examples_gray.png', img_gray)

灰度图-RGB图相互转换

1 PIL.Image

1
2
3
4
5
6
7
8
9
10
11
12
from PIL import Image
img = Image.open('examples.png')
img_gray = img.convert('L') # RGB转换成灰度图像
img_rgb = img_gray.convert('RGB') # 灰度转RGB
print(img)
print(img_gray)
print(img_rgb)

[out]
<PIL.PngImagePlugin.PngImageFile image mode=RGB size=987x824 at 0x7FC2CCAE04D0>
<PIL.Image.Image image mode=L size=987x824 at 0x7FC2CCAE0990>
<PIL.Image.Image image mode=RGB size=987x824 at 0x7FC2CCAE0250>

2 cv2(注意,opencv在读入图片的时候就可以通过参数实现颜色通道的转换,下面是用别的方式实现)

1
2
3
4
5
6
import cv2
import pylab as plt
img = cv2.imread('examples.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR转灰度
img_bgr = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2BGR) # 灰度转BRG
img_rgb = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2RGB) # 也可以灰度转RGB

from: numpy、cv2等操作图片基本操作

Author: Mrli

Link: https://nymrli.top/2021/12/26/Python中关于图片的读取/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
Python科学计算常用API记录
NextPost >
Unity游戏开发学习
CATALOG
  1. 1. 读取
    1. 1.1. matplotlib.pyplot / pylab
    2. 1.2. PIL.image.open
    3. 1.3. cv2.imread
  2. 2. 保存
    1. 2.1. plt.savefig()
    2. 2.2. PIL.image - 保存PIL格式的图片
    3. 2.3. cv2.imwrite
  3. 3. 灰度图-RGB图相互转换
    1. 3.1. 1 PIL.Image
    2. 3.2. 2 cv2(注意,opencv在读入图片的时候就可以通过参数实现颜色通道的转换,下面是用别的方式实现)