Python用61行代码实现图片像素化的示例代码
作者:北方 发布时间:2021-08-27 13:10:55
标签:Python,图片,像素化
起因
看到网上的像素图片,感觉蛮有趣的,就打算用python一些PIL类库写一个。
实现思路
把一张图片分成多个块,每个块的颜色都等于这个色块中颜色最多的颜色,如下图。
这个图取2×2的像素为块的大小,把快中颜色与每个颜色出现的数量存放到字典里,取最大的颜色,填充整个块。
具体实现
from PIL import Image
def init():
# 设置每个像素区块的大小
block_size = 75
img = Image.open("a.jpg")
# 获取图片的宽高
width, height = img.size
# 获取像素点对应RGB颜色值,可以改变img_array中的值来改变颜色值
img_array = img.load()
# 为了处理最后的区块,加了一次循环
max_width = width + block_size
max_height = height + block_size
for x in range(block_size - 1, max_width, block_size):
for y in range(block_size - 1, max_height, block_size):
# 如果是最后一次循环,则x坐标等于width - 1
if x == max_width - max_width % block_size - 1:
x = width - 1
# 如果是最后一次循环,则x坐标等于height - 1
if y == max_height - max_height % block_size - 1:
y = height - 1
# 改变每个区块的颜色值
change_block(x, y, block_size, img_array)
y += block_size
x += block_size
img.save(r'D:\python\pixel_image\awesome_copy.png')
img.show()
"""
:param x坐标 x:
:param y坐标 y:
:param 区块大小 black_size:
:param 可操作图片数组 img_array:
"""
def change_block(x, y, black_size, img_array):
color_dist = {}
block_pos_list = []
for pos_x in range(-black_size + 1, 1):
for pos_y in range(-black_size + 1, 1):
# todo print(x + pos_x,y + pos_y)
block_pos_list.append([x + pos_x, y + pos_y])
for pixel in block_pos_list:
if not str(img_array[pixel[0], pixel[1]]) in color_dist.keys():
color_dist[str(img_array[pixel[0], pixel[1]])] = 1
else:
color_dist[str(img_array[pixel[0], pixel[1]])] += 1
# key-->value => value-->key
new_dict = {v: k for k, v in color_dist.items()}
max_color = new_dict[max(color_dist.values())]
# 将区块内所有的颜色值设置为颜色最多的颜色
for a in block_pos_list:
img_array[a[0], a[1]] = tuple(list(map(int, max_color[1:len(max_color) - 1].split(","))))
def get_key(dict, value):
return [k for k, v in dict.items() if v == value]
if __name__ == "__main__":
init()
效果对比
总结
开源地址https://github.com/MasakiOvO/pixel_image
还有很多改进的地方,比如取色值的算法上,应该有更好的解决方法,应该用多进程来实现,这样程序速度会快很多。OvO
来源:https://segmentfault.com/a/1190000017311402
0
投稿
猜你喜欢
- 1、su – oracle 不是必需,适合于没有DBA密码时使用,可以不用密码来进入sqlplus界面。 2、sqlplus /
- OpenAI 是一个人工智能的工具包,包括神经网络、遗传算法和有限状态机等。使用python可以非常便捷的操作OpenAI的API。一下是O
- PyTorch上的常用数据类型如下Data typedtypeCPU tensorGPU tensorSize/bytes32-bit fl
- PHP simplexml_load_file() 函数实例转换 XML 文件为 SimpleXMLElement 对象,然后输出对象的键和
- 一、python图形界面tk之滚动文本框的实现示例使用python的tkinter库实现滚动文本框的方式,目前我知道的有两种,一
- 一、简介从Python2.6开始,新增了str.format(),它增强了字符串格式化的功能。基本语法是通过 {} 和 : 来代替以前的 %
- Pandas count()与values_count()用法count()values_count()在指定的统计的列名上结果多了该列:对
- ScrapyScrapy是纯python实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。Scrapy使用了Twisted异步网络
- 引言什么是数据结构?数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说,数据结构就是设计数据
- 本文实例讲述了python实现定时同步本机与北京时间的方法。分享给大家供大家参考。具体如下:这段python代码首先从www.beijing
- 前面写过一篇关于python多线程的实现的文章, 但是效果不是最佳的,写法也不是很好。通过网上学习,也了解到了semaphore这个东西。百
- 第一阶段:从官网下载Anaconda之后,安装,一切正常。打开Anaconda navigator,提示我是否更新,要选不要更新。点击spy
- 目前两个客户端扩展库连接超时可以设置选项来操作,比如mysqli: <?php //创建对象 $mysqli = mysqli_ini
- 如下所示:f = open('./val.txt')lines = f.readlines() #整行读取f.close()
- QUICKSORT(A, p, r)是快速排序的子程序,调用划分程序对数组进行划分,然后递归地调用QUICKSORT(A, p, r),以完
- 突然想到了之前一直没留意的for循环中开goroutine的执行顺序问题,就找了段代码试了试,试了几次后发现几个有意思的地方,我暂时没有精力
- re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。语法格式:re.find
- lstm(*input, **kwargs)将多层长短时记忆(LSTM)神经网络应用于输入序列。参数:input_size:输入'x
- 本文实例讲述了Python多进程机制。分享给大家供大家参考。具体如下:在以前只是接触过PYTHON的多线程机制,今天搜了一下多进程,相关文章
- 前言功能新增学生显示学生查找学生删除学生存到文档创建入口函数在入口函数中,可以先打印一个菜单,用菜单来进行交互。def menu(): &n