目录

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专栏」后台回复:「马赛克」,获取本文所涉及的完整代码。

用Python帮你上马,哪里无码打哪里的更多相关文章

  1. Python基础-字符编码与转码

    ***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...

  2. Python虚拟机函数机制之无参调用(一)

    PyFunctionObject对象 在Python中,任何一个东西都是对象,函数也不例外.函数这种抽象机制,是通过一个Python对象——PyFunctionObject来实现的 typedef s ...

  3. 用Python帮你实现IP子网计算

    目录 0. 前言 1. ipaddress模块介绍 1.1 IP主机地址 1.2 定义网络 1.3 主机接口 1.4 检查address/network/interface对象 1.4.1 检查IP版 ...

  4. Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)

    二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...

  5. Python 练习册--生成唯一激活码(邀请码)

    题目是这样子的: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? 分析 其实要生成 ...

  6. 让大蛇(Python)帮你找工作

    前段时间用Python实现了一个网络爬虫(让大蛇(Python)帮你找工作),效率总体还可以,但是缺点就是每次都需要手动的去触发,于是打算对该爬虫加上Timer,经过网上一番搜索以及API的查询,发现 ...

  7. Python智能检测编码并转码

    #安装包工具 $pip3 install chardet #直接打开文件,中文显示乱码 >>> import chardet >>> f = open('test. ...

  8. Python Django中QQ邮箱授权码问题

    Python Django中QQ邮箱授权码问题 系统及软件版本如下: Ubuntu Kylin 16.04 Python 3.5.1 Django 1.9.7 PyCharm Community Ed ...

  9. Cobub无码埋点关键技术的实现

    随着大数据时代的到来,数据采集也已经变的越来越重要.前端埋点作为一个比较成熟的数据接入手段被广泛应用着.目前埋点分为两种方式,有码与无码埋点.有码埋点比较容易理解,即调用SDK的API,在代码中插入埋 ...

随机推荐

  1. Oracle:Redhat 7.4+Oracle Rac 11.2.0.4 执行root.sh报错处理

    一.报错信息 二.原因分析 因为RHEL 7使用systemd而不是initd运行进程和重启进程,而root.sh通过传统的initd运行ohasd进程 三.解决办法 在RHEL 7中ohasd需要被 ...

  2. css横屏问题的设置

    <link rel="stylesheet" media="all and (orientation:portrait)" href="css/ ...

  3. 一语点醒技术人:你不是 Google(转载)

    转载链接:https://www.infoq.cn/article/2017/06/U-no-Google 在为问题寻找解决方案时要先充分了解问题本身,而不是一味地盲目崇拜那些巨头公司.Ozan On ...

  4. MySQL通过SHOW TABLE STATUS查看库中所有表的具体信息

    有时候我们想看下指定库下所有表的使用情况,比如,查询表的Table大小,什么时候创建的,数据最近被更新的时间(即最近一笔insert/update/delete的时间).这些信息对我们进行库表维护很有 ...

  5. 设备树处理之——device_node转换成platform_device【转】

    转自:https://www.cnblogs.com/downey-blog/p/10486568.html 以下讨论基于linux4.14,arm平台 platform device 设备树的产生就 ...

  6. Shell命令-搜索文件或目录之whereis、locate

    文件及内容处理 - whereis.locate 1. whereis:查找二进制命令,按环境变量PATH路径查找 whereis命令的功能说明 whereis 命令用于查找文件.该指令会在特定目录中 ...

  7. CodeForces - 1257E (思维)

    题意 https://vjudge.net/problem/CodeForces-1257E 三个人,每个人有一些数字,组合起来是1~n,每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人 ...

  8. 2019 Multi-University Training Contest 1 String(序列自动机+贪心)

    题意 链接:https://vjudge.net/problem/HDU-6586 给你一个字符串和k,还有每个字符出现次数的限制,求一个长度为k的字典序最小的满足限制的子序列. 思路 先构造出序列自 ...

  9. 多线程状态与优先级、线程同步与Monitor类、死锁

    一.线程状态 二.线程优先级 三.初步尝试多线程 class Program { static void Main(string[] args) { while (true) { MessagePri ...

  10. python获取某路径下,某种特定类型的文件名称,os.walk(路径)生成器;os.listdir(路径),os.path.splitext(名称),os.path.join(路径,名称),os.path.isdir(路径\名称)

    #获取某文件夹下制定类型文件# import os# def filep(fp):# l=[]# a=os.walk(fp) #生成器# for nowp,sonp,oth in a: #当前目录,子 ...