zoukankan      html  css  js  c++  java
  • 用Python帮你上马,哪里无码打哪里

    目录
    0 引言
    1 环境
    2 需求分析
    3 代码实现
    4 代码全景展示
    5 后记

    0 引言

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

    ▲效果图

    ▲原图

    怎么样,效果还不错吧?现在,我们用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专栏」后台回复:「马赛克」,获取本文所涉及的完整代码。

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/moonhmily/p/11059694.html
Copyright © 2011-2022 走看看