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

PIL的Image笔记

2019/11/26 编程笔记 Python 科学计算
Word count: 934 | Reading time: 4min

PIL的Image学习

transpose和rotate

  • transpose
1
2
3
4
from PIL import Image
img = getCaptcha()
# 对称反转
img.transpose(Image.FLIP_LEFT_RIGHT)
  • rotate
1
2
3
4
5
6
from PIL import Image
img = getCaptcha()
# expand默认为False时,超出原有尺寸的部分将用黑色填充,不会拓展尺寸
img = img.rotate(45)
# expand为True时,会根据图片大小,拓展尺寸
img = img.rotate(45,expand=True)

Pillow官网介绍

【图像处理】Python-Image 基本的图像处理

convert函数

参数为mode(图像模式)。这是一个字符串,指定图像使用的像素格式。典型值为“1”,“L”,“RGB”或“CMYK”。

1
img = img.convert("1")
  • 1 (1-bit pixels, black and white, stored with one pixel per byte)
  • L (8-bit pixels, black and white)
  • P (8-bit pixels, mapped to any other mode using a color palette)
  • RGB (3x8-bit pixels, true color)
  • RGBA (4x8-bit pixels, true color with transparency mask)
  • CMYK (4x8-bit pixels, color separation)
  • YCbCr (3x8-bit pixels, color video format)
  • LAB (3x8-bit pixels, the Lab color space)
  • HSV (3x8-bit pixels, Hue, Saturation, Value color space)
  • I (32-bit signed integer pixels)
  • F (32-bit floating point pixels)

PIL image与np.array互转

1. PIL image转换成array

img = np.asarray(image)img=np.array(image)

需要注意的是,如果出现read-only错误,并不是转换的错误,一般是你读取的图片的时候,默认选择的是"r","rb"模式有关。

修正的办法: 手动修改图片的读取状态
img.flags.writeable = True # 将数组改为读写模式

2. array转换成image

方法1

1
2
from PIL import Image
Image.fromarray(np.uint8(img))

方法2

1
2
3
4
import cv2
cv2.imwrite("output.png", out)
# out可以是uint16类型数据
# 16位深度图像转8位灰度

方法3

matlab

1
2
3
img=imread('output.png')
img1=im2uint8(img)
imwrite(img1,'result.jpg')

Numpy将二维数组添加到空数组

1
2
3
4
5
6
7
8
9
10
11
12
13
a=np.empty(shape=[0,3], dtype=np.int32)
b = np.array([[1,2,3],[4,5,6]])
c=[[7,8,9]]

print(a.shape)
print(b.shape)

a = np.append(a, b, axis=0)
a = np.append(a, c, axis=0)
# 当axis为0时,数组是加在下面(列数要相同):
# 当axis为1时,数组是加在右边(行数要相同):
print(a.shape)
print(b.shape)

reshape函数是numpy中一个很常用的函数,作用是在不改变矩阵的数值的前提下修改矩阵的形状。

1.简单使用

1
2
3
4
y = np.reshape([[1,2],[3,4]],(1,4))
'''
array([[1, 2, 3, 4]])
'''

2.使用缺省值-1

缺省值-1代表我不知道要给行(或者列)设置为几,reshape函数会根据原矩阵的形状自动调整。

1
2
3
4
5
6
7
y = np.reshape([[1,2],[3,4]],(4,-1))
'''
array([[1],
[2],
[3],
[4]])
'''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import PIL.Image as Image
import os

IMAGES_PATH = 'E:\picture\新垣结衣\\' # 图片集地址
IMAGES_FORMAT = ['.jpg', '.JPG'] # 图片格式
IMAGE_SIZE = 256 # 每张小图片的大小
IMAGE_ROW = 4 # 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_COLUMN = 4 # 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_SAVE_PATH = 'E:\\picture\\新垣结衣\\final.jpg' # 图片转换后的地址

# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
os.path.splitext(name)[1] == item]

# 简单的对于参数的设定和实际图片集的大小进行数量判断
if len(image_names) != IMAGE_ROW * IMAGE_COLUMN:
raise ValueError("合成图片的参数和要求的数量不能匹配!")

# 定义图像拼接函数
def image_compose():
to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE)) #创建一个新图
# 循环遍历,把每张图片按顺序粘贴到对应位置上
for y in range(1, IMAGE_ROW + 1):
for x in range(1, IMAGE_COLUMN + 1):
from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize(
(IMAGE_SIZE, IMAGE_SIZE),Image.ANTIALIAS)
to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))
return to_image.save(IMAGE_SAVE_PATH) # 保存新图
image_compose() #调用函数

Author: Mrli

Link: https://nymrli.top/2019/11/26/PIL的Image笔记/

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

< PreviousPost
Hungarian algorithm匈牙利算法
NextPost >
2019年8月23号运维笔记
CATALOG
  1. 1. PIL的Image学习
    1. 1.1. transpose和rotate
    2. 1.2. convert函数
    3. 1.3. PIL image与np.array互转
      1. 1.3.1. 1. PIL image转换成array
      2. 1.3.2. 2. array转换成image