目录
1 环境
2 需求分析
3 代码实现
4 代码全景展示
5 后记
所谓的像素图, 就是对图像做一个颗粒化的效果, 使其产生一种妙不可言的朦胧感. 费话不多说, 先来看一张效果图.
<center>▲效果图 < center>
<center>▲原图 < center>
怎么样, 效果还不错吧? 现在, 我们用 Python 来实现这种像素化的效果.
1 环境
操作系统: Windows
Python 版本: 3.7.3
2 需求分析
一个最简单的实现思路, 在打开图片后, 把图片分割成一些像素块, 再对这些像素块中的图像信息进行处理 (修改图像中的 RGB 值) 即可.
这里我们使用 Numpy 库和 PIL 库来实现这个需求, 后者用来图像的读取与保存, 涉及到的所有图像处理动作均借助 Numpy 来实现.
有关 NumPy 模块, PIL 模块的介绍, 可参考如下.
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库, 支持大量的维度数组与矩阵运算, 此外也针对数组运算提供大量的数学函数库.
PIL(Python Imaging Library)是 Python 常用的图像处理库, 而 Pillow 是 PIL 的一个友好 Fork, 提供了了广泛的文件格式支持, 强大的图像处理能力, 主要包括图像储存, 图像显示, 格式转换以及基本的图像处理操作等.
这两个模块非 Python 内置, 都属于第三方模块, 可直接采用如下方式进行安装
- pip install numpy
- pip install Pillow
注意, 要想使用 PIL 模块, 是需要直接 install Pillow 模块的.
3 代码实现
首先导入我们要用到的模块
- import numpy as np
- from PIL import Image
接下来, 我们要处理图片, 首先得打开一张图片, 如下
data = Image.open("P:\\Personal\\LuoShen.xpg")
然后把图像转换化 Numpy 数组进行下一步的处理
im1 = np.array(data)
这里处理的核心思想, 也很简单, 主要通过中间值的 RGB, 对所选范围块的 RGB 进行重新赋值.
im1[y:y + pixel, x:x + pixel] = im1[y + (pixel // 2)][x + (pixel // 2)]
这里的 x,y 是分别指的我们图像的横向, 纵向像素点的坐标值, 而 pixel 指的是我们要以多大的像素块, 来处理这张图像, 我们设置的单位像素块 (Pixel 数值) 越小, 生成的像素图越精确.
当然了, 若单位像素块设置的太小, 生成图像就看不出效果了, 至于多大的数值合适, 需要自行尝试. 不同尺寸的图像, 要达到最佳的像素化的显示效果, 所需要设置的单位像素块的大小也是不同的, 实践出真知.
我们需要图像的指定一个处理范围, 并对该范围内的每一个坐标 (像素) 点进行像素化的处理.
- for y in range(Start_coordinate[1], End_coordinate[1], pixel):
- for x in range(Start_coordinate[0], End_coordinate[0], pixel):
- pass
在处理完成之后, 我们再把 Numpy 数组转换回图像.
im2 = Image.fromarray(im1.astype(np.uint8))
最后展示出处理后的图像
im2.show()
4 代码全景展示
- import numpy as np
- from PIL import Image
- def to_pixelBlock(pixel, Start_coordinate, End_coordinate):
- '''
- :param pixel: 单位像素块的元素大小
- :param Start_coordinate: 处理的起始坐标 (像素) 点, 元组形式
- :param End_coordinate: 处理的终止坐标 (像素) 点, 元组形式
- :return:
- 通过中间值的 RGB, 对所选范围块的 RGB 进行重新赋值, 设置的单位像素块 (Pixel 数值) 越小, 生成的像素图越精确
- '''
- # 读取图片, 并由 PIL image 转换为 NumPy array
- im1 = np.array(Image.open("P:\\Personal\\LuoShen.jpg"))
- # 遍历所要处理范围内的所有坐标 (像素) 点
- for y in range(Start_coordinate[1], End_coordinate[1], pixel):
- for x in range(Start_coordinate[0], End_coordinate[0], pixel):
- # 通过中间值的 RGB, 对所选范围块的 RGB 进行重新赋值
- im1[y:y + pixel, x:x + pixel] = im1[y + (pixel // 2)][x + (pixel // 2)]
- # 将 NumPy array 转换为 PIL image
- im2 = Image.fromarray(im1.astype(np.uint8))
- # 展示处理后的图像
- im2.show()
- if __name__ == '__main__':
- # 设置好要处理的像素范围, 并以多大的像素块来生成最终效果图
- to_pixelBlock(10, (0, 0), (1280, 800)
5 后记
本文使用了 PIL 加上 Numpy 的配合, 短短几行代码实现了图像像素化的处理. 当然这只是一种简单地实现, 要想实现更丰富的处理效果, 还可以借助 CV2 来实现.
好了, 以上就是本篇全部内容.
公众号「Python 专栏」后台回复:「马赛克」, 获取本文所涉及的完整代码.
来源: http://www.bubuko.com/infodetail-3099979.html