目录
0 引言
1 环境
2 需求分析
3 代码实现
4 代码全景展现
5 后记python
所谓的像素图,就是对图像作一个颗粒化的效果,使其产生一种妙趣横生的朦胧感。费话很少说,先来看一张效果图。数组
▲原图函数
怎么样,效果还不错吧?如今,咱们用Python来实现这种像素化的效果。ui
操做系统:Windows操作系统
Python版本:3.7.3code
一个最简单的实现思路,在打开图片后,把图片分割成一些像素块,再对这些像素块中的图像信息进行处理(修改图像中的RGB值)便可。blog
这里咱们使用Numpy库和PIL库来实现这个需求,后者用来图像的读取与保存,涉及到的全部图像处理动做均借助Numpy来实现。图片
有关NumPy模块、PIL模块的介绍,可参考以下。ip
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。数学
PIL(Python Imaging Library)是Python经常使用的图像处理库,而Pillow是PIL的一个友好Fork,提供了了普遍的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操做等。
这两个模块非Python内置,都属于第三方模块,可直接采用以下方式进行安装
pip install numpy pip install Pillow
注意,要想使用PIL模块,是须要直接install Pillow模块的。
首先导入咱们要用到的模块
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()
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)
本文使用了PIL加上Numpy的配合,短短几行代码实现了图像像素化的处理。固然这只是一种简单地实现,要想实现更丰富的处理效果,还能够借助CV2来实现。
好了,以上就是本篇所有内容。
公众号「Python专栏」后台回复:「马赛克」,获取本文所涉及的完整代码。