用Python帮你打码,哪里无码打哪里

作者 | 上海小胖

来源 | Python专栏(xpchuiit)


目录

0 引言

1 环境

2 需求分析

3 代码实现

4 代码全景展示

5 后记


0 引言


所谓的像素图,就是对图像做一个颗粒化的效果,使其产生一种妙不可言的朦胧感。费话不多说,先来看一张效果图。


640?wx_fmt=jpeg▲效果图


640?wx_fmt=jpeg▲原图


怎么样,效果还不错吧?现在,我们用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, (00), (1280800)


5 后记

本文使用了PIL加上Numpy的配合,短短几行代码实现了图像像素化的处理。当然这只是一种简单地实现,要想实现更丰富的处理效果,还可以借助CV2来实现。

 

好了,以上就是本篇全部内容。


本文所涉及的完整代码已经放在GitHub上:

https://github.com/MiracleYoung/You-are-Pythonista/tree/master/PythonExercise/Tool/Convert_IMG_to_Pixel/


(*本文仅代表作者观点,转载请联系原作者)


精彩推荐


大会开幕倒计时 天!2019 以太坊技术及应用大会特邀以太坊创始人V神与众多海内外知名技术专家齐聚北京,聚焦区块链技术,把握时代机遇,深耕行业应用,共话以太坊 2.0 新生态。即刻扫码,享优惠票价!


640?wx_fmt=jpeg

推荐阅读:


640?wx_fmt=png 你点的每个“在看”,我都认真当成了喜欢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值