Pillow教程05:NumPy数组和PIL图像的相互转化

---------------Pillow教程集合---------------

Python项目18:使用Pillow模块,随机生成4位数的图片验证码

Python教程93:初识Pillow模块(创建Image对象+查看属性+图片的保存与缩放)

Pillow教程02:图片的裁剪+复制粘贴+旋转角度+翻转+降噪滤镜(平滑、锐化、边缘检测)

Pillow教程03:图像处理的基本步骤+分离split+合并merge+混合blend+composite遮罩

Pillow教程04:学习Draw绘制+Font字体+alpha composite方法,给图片添加文字水印

1.Image.fromarray():用于从NumPy数组创建PIL图像。NumPy数组通常用于科学计算,并且它允许你以高效的方式处理大型多维数组和矩阵。当你有一个NumPy数组,并且该数组的数据类型和形状适合表示图像时,你可以使用Image.fromarray()来将这个数组转换为一个PIL图像对象。

2.numpy.full 是 NumPy 库中的一个函数,用于创建一个具有给定形状和填充值的数组。它的语法如下:

numpy.full(shape, fill_value, dtype=None, order='C')

参数解释:
shape:输出的数组形状,例如 (2, 3) 表示一个 2x3 的二维数组。
fill_value:用于填充值。
dtype:输出数组的数据类型。如果未指定,则根据 fill_value 的类型推断。
order:指定数组在内存中的存储顺序,可以是 ‘C’(按行)或 ‘F’(按列)。

import numpy as np

# 1.创建一个形状为 (3,)的数组,并用值 5 填充  
arr1 = np.full((3,), 5)
print(arr1)  # 输出: [5 5 5]  

# 2.创建一个形状为 (2, 2) 的数组,并用值 7 填充  
arr2 = np.full((2, 2), 7)
print(arr2)  # 输出:  
# [[7 7]  
#  [7 7]]  

# 3.创建一个形状为 (2, 3) 的数组,并用字符串 'a' 填充  
arr3 = np.full((2, 3), 'a')
print(arr3)  # 输出:  
# [['a' 'a' 'a']  
#  ['a' 'a' 'a']]

在这里插入图片描述
3.代码解析:创建了一个全黑的400x400像素图像。然后,它定义了四种颜色(红色、绿色、蓝色和黄色),并将这些颜色分配给四个200x200像素的小块。最后,它使用np.full来创建每个小块的颜色数组,并将这些数组放置到原始图像数组的相应位置。完成这些步骤后,你就可以得到一个被四种颜色平均分割的图像了。NumPy数组的形状通常对应于图像的宽度、高度和(可能的)颜色通道数。

# -*- coding: utf-8 -*-
# @Author : 小红牛
# 微信公众号:WdPython
import numpy as np
from PIL import Image


# 1.创建全黑的原始图像数组
# 原始图像尺寸
width, height = 400, 400
# 每个小块的尺寸
block_size = 200
array = np.zeros((height, width, 3), dtype=np.uint8)

# 定义四种颜色(这里用RGB值表示)
colors = [
    (255, 0, 0),  # 红色
    (0, 255, 0),  # 绿色
    (0, 0, 255),  # 蓝色
    (255, 255, 0)  # 黄色
]

# 2.遍历每个小块并填充颜色
for i in range(2):
    for j in range(2):
        # 计算当前小块的左上角坐标
        x_start = j * block_size
        y_start = i * block_size

        # 创建当前小块的颜色数组
        block_color = np.full((block_size, block_size, 3), colors[i * 2 + j], dtype=np.uint8)
        # 将颜色数组填充到原始图像数组的对应位置
        array[y_start:y_start + block_size, x_start:x_start + block_size] = block_color

# 3.使用Image.fromarray将NumPy数组转换为图像
image = Image.fromarray(array)

# 4.保存图像
image.save('colored_blocks.png')

4.图像转化为ndarray数组:image_array现在是一个包含图像数据的三维NumPy数组。数组的第一个维度是图像的高度(行数),第二个维度是图像的宽度(列数),第三个维度是颜色通道数(对于RGB图像通常是3)。数组中的每个元素对应图像中的一个像素,其值表示该像素在对应颜色通道中的强度。

# @Author : 小红牛
# 微信公众号:WdPython
from PIL import Image
import numpy as np

# 1.打开图像文件
# 替换为你的图像文件路径
image = Image.open('path_to_your_image.png')

# 2.将图像转换为ndarray数组
image_array = np.array(image)

# 3.输出数组的形状和数据类型
print(image_array.shape)  # 输出图像的尺寸(高度, 宽度, 通道数)  
print(image_array.dtype)  # 输出数组的数据类型,通常是uint8  

# 4.如果你想查看数组中的一部分数据,可以这样做:
print(image_array[:10, :10])  # 输出图像左上角10x10像素区域的数据

# 5.ndarray数组转换为Image图像
arr_img = Image.fromarray(image_array)
# 保存图片
arr_img.save('array.png')

完毕!!感谢您的收看

----------★★历史博文集合★★----------

我的零基础Python教程,Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具 NumPy Pygame 图像处理

上一篇:卷积神经网络六:ResNet


下一篇:用CSS实现单行、多行文本溢出隐藏