Python使用图片作为像素生成像素画
具体见代码。
#!python3
# -*- coding: utf-8 -*-import os
import math
from PIL import Imageclass ProcessBar(object):"""一个打印进度条的类"""def __init__(self, total): # 初始化传入总数self.shape = ['▏', '▎', '▍', '▋', '▊', '▉']self.shape_num = len(self.shape)self.row_num = 30self.now = 0self.total = totaldef print_next(self, now=-1): # 默认+1if now == -1:self.now += 1else:self.now = nowrate = math.ceil((self.now / self.total) * (self.row_num * self.shape_num))head = rate // self.shape_numtail = rate % self.shape_numinfo = self.shape[-1] * headif tail != 0:info += self.shape[tail-1]full_info = '[%s%s] [%.2f%%]' % (info, (self.row_num-len(info)) * ' ', 100 * self.now / self.total)print("\r", end='', flush=True)print(full_info, end='', flush=True)if self.now == self.total:print('')class MosaicImg(object):'''用于将源图像当成一个像素点合成目标图像'''def __init__(self,target, # 目标图像的路径,图像的透明区域会被忽略img_path, # 源图片的目录,里面的图片将被拿来作为像素点pixel_size=50, # 每个像素图片的宽高size=(0, 0), # 最后生成的图片的尺寸,格式是 (width, height)scale_factor=-1, # 缩放因子,0~1之间的浮点数,如果设定了这个,则 size 无效):path = os.path.split(target)name, ext = os.path.splitext(path[1])self.save_img = os.path.join(path[0], "mosaic_" + name + '.png') # 生成的图像名字self.pixel_size = pixel_size# 处理目标图像self.target = Image.open(target).convert('RGBA')if scale_factor == -1: # 使用 size 参数self.target.thumbnail(size)else: # 使用 scale_factor 参数new_size = (scale_factor * self.target.size[0], scale_factor * self.target.size[1])self.target.thumbnail(new_size)# 处理源图像self.images = {} # key是一张图片的主颜色,value是该图片的 PIL.Image 对象self.images_count = {}file_list = os.listdir(img_path)print("正在读取源图像:")pb = ProcessBar(len(file_list))for file in file_list: # 遍历目录img = Image.open(os.path.join(img_path, file)).convert('RGB')img.thumbnail((pixel_size, pixel_size)) # 重设图片大小color = self.main_color(img) # 计算主颜色self.images[color] = imgself.images_count[color] = 0pb.print_next()# 每个图像最多使用的次数self.max_img_use = 3 * self.target.size[0] * self.target.size[1] / len(self.images)def gen_mosaic_image(self):'''使用初始化的设置生成像素图。其具体做法是遍历目标图像,对每个像素点的颜色,从源图像的主颜色中找到一个最接近的,然后将该图像当成像素点'''# 最后生成的图像的大小size = (self.pixel_size * self.target.size[0], self.pixel_size * self.target.size[1])self.mosaic_img = Image.new('RGBA', size)# 开始生成图像print("正在生成图像: ")# 遍历每一个像素pb = ProcessBar(self.target.size[0])for x in range(self.target.size[0]):for y in range(self.target.size[1]):r, g, b, a = self.target.getpixel((x, y)) # 得到该像素的颜色if a == 0: # 跳过透明区域continuemin_score = 1000min_color = Nonefor color in self.images: # 找到最接近的颜色score = self.color_distance((r, g, b), color)if score < min_score:min_score = scoremin_color = color# 将图片贴上去self.mosaic_img.paste(self.images[min_color], (x*self.pixel_size, y*self.pixel_size))self.images_count[min_color] += 1 # 使用次数+1# 超过了最大使用次数就删除if self.images_count[min_color] > self.max_img_use:self.images.pop(min_color)pb.print_next()print('正在保存图像,请稍候。')self.mosaic_img.save(self.save_img, format='PNG')return self.mosaic_imgdef main_color(self, image):'''得到一张图片的主颜色,这里使用了偷懒的做法,将图片resize到一个像素点大小,取该点的像素值'''img = image.resize((1, 1), Image.BICUBIC)return img.getpixel((0, 0))def color_distance(self, rgb_1, rgb_2):'''两个RGB颜色的相似度计算,使用LAB颜色空间'''R_1, G_1, B_1 = rgb_1R_2, G_2, B_2 = rgb_2rmean = (R_1 + R_2) / 2R = R_1 - R_2G = G_1 - G_2B = B_1 - B_2return math.sqrt((2+rmean/256)*(R**2)+4*(G**2)+(2+(255-rmean)/256)*(B**2))if __name__ == '__main__':current_path = os.path.dirname(os.path.abspath(__file__)) # 当前目录的完整路径img_path = os.path.join(current_path, 'dog') # 存放源图像的目录target = os.path.join(current_path, 'xinxin.png') # 目标图像ma = MosaicImg(target, img_path, 70, scale_factor=0.1) # 初始化img = ma.gen_mosaic_image() # 生成图像
Python使用图片作为像素生成像素画相关推荐
- Python帮你完成美术作业——图片转灰度,字符画,素描手绘风格
Python图像处理--图片转黑白,字符画,手绘风 实现原理 用PIL,一个强大的python图像处理库.主要用到了Image. 终端下载命令: pip install pillow 代码 自己在东方 ...
- python画圆形螺旋线_这个Python项目,一秒生成可爱像素风图片
本文转自:量子位,作者郭一璞整理来自:大邓和他的 Python像文字云一样,用各种小图拼出大的图片,构建一个像素风的世界,就像<我的世界>里一样,一定非常有趣.还可以拿来做拼贴画.十字绣等 ...
- 【python】将图片绘制成像素风的画,Tiler
这个项目超级火! 将图片转化成像素风的画. 不要问,问就是Tiler! 项目地址: git clone https://github.com/nuno-faria/tiler.git 安装依赖包: p ...
- python 将图片转换成像素画_Canvas 实现位图转像素画
2016 年快结束了,最后一天总要留下点什么. 前段时间迷上像素画,折腾了好一段时间,后来思考了下,能不能用程序或者有什么图像处理软件能把一张图片直接转成像素风格? 于是先谷歌一下,在豆瓣发现了这个很 ...
- 怎样用python生成中文字符画_如何利用Python实现图片转字符画详解
本篇文章主要介绍了Python实现图片转字符画的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 字符画真的很有意思,将图片中的像素用字符代替,就生成了字符画. 但是像 ...
- python获取图片像素矩阵_用python处理图片实现图像中的像素访问
这篇文章主要介绍了关于用python处理图片实现图像中的像素访问,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然 ...
- python获取图片像素点颜色_Python获取图片位置像素色值及判断色值是否存在
本文背景: 公司项目的广告系统有个功能,给图片模板打指定的颜色值点,根据需要拼合的图片数量,打点数量也不同.设计说他弄好了,运营上传打点后的模板图片时,获取不到打点的位置坐标.于是找研发看是怎么回事, ...
- 实现SLIC算法生成像素画
前言 像素风最早出现在8bit的电子游戏中,受制于电脑内存大小以及显示色彩单一, 只能使用少量像素来呈现内容,却成就了不少经典的像素游戏.随着内存容量与屏幕分辨率的提升,内存与显示媒介的限制不再是问题 ...
- 【Python+图片切割+图片合并】基于Python的图片批量切割与合并(保持原像素不变,不会出现像素大小不匹配、填充黑边的问题)
基于Python的图片批量切割与合并(保持原像素不变,不会出现像素大小不匹配.填充黑边的问题) 前言 效果图 1.批量读取文件 2.清空目标目录方法(配合切割图片方法使用) 3.批量切割图片(像素不足 ...
最新文章
- SSL 2311-车厢调度[栈]
- 朱峰谈概念设计(五):进入焦距
- Docker安装Python3.5
- SE37 test sequence - 在同一个main session内依次执行function module
- thinkphp 助手函数url不生成https_thinkphp5.0 URL 地址生成
- 【雅礼集训2017】字符串【后缀自动机】【数据分治】
- 【HDU - 5916】Harmonic Value Description (构造,思维,SJ题)
- arcgis图层叠加不匹配
- java仿百度分页_java仿百度假分页代码实现
- OUC_Summer Training_ DIV2_#11 722
- 透明网桥(计算机网络)
- better-scroll 在vue中使用on监听事件,事件无效问题解决
- 详细理解TDMA以及OFDMA,更容易读懂论文
- 币种对应的转换因子(处理日元台币…
- ISO9000中服装加工行业应执行哪些检验标准?
- 那些曾让我一脸懵逼的python代码
- PHP word ppt pdf 转图片
- word+正则表达式==快速批量添加图注题注(保姆级图文)
- 点赋网络:淘宝小卖家的运营之道
- 删除Windows下samba保存的用户名和密码