1500张图片画腊八粥

  • 前言
  • 开始
    • 献上代码
    • 代码剖析
    • 项目github
      • 作者

前言

昨天是腊八,大家喝腊八粥了吗?反正我是忘了

开始

献上代码

from PIL import Image
import numpy as np
import os
def make(imgMat):img = Image.new("RGB",(64 * len(imgMat),64 * len(imgMat[0])))for i in range(len(imgMat)):for j in range(len(imgMat[i])):imgMat[i][j] = imgMat[i][j].resize((64,64))img.paste(imgMat[i][j],(64 * i,64 * j))return img
def split(img,w,h):mat = []for i in range(h):l = []for j in range(w):box = (64 * i,64 * j,64 * i + 64,64 * j + 64)l.append(img.crop(box))mat.append(l)return mat
def mean_color(img):r,g,b,*_ = img.split()r = np.array(r)g = np.array(g)b = np.array(b)r = np.mean(r.flatten())g = np.mean(g.flatten())b = np.mean(b.flatten())return r,g,b
def distance(img1,img2):r,g,b = mean_color(img1)R,G,B = mean_color(img2)dr,dg,db = R - r,G - g,B - breturn np.sqrt(dr ** 2 + dg ** 2 + db ** 2)
def choose(imglist,img):mindist = 500minImage = Nonefor i in imglist:dist = distance(i,img)if(dist < mindist):mindist = distminImage = ireturn minImage
def process(imgList,img,w,h):mat = split(img,w,h)res = []for i in mat:l = []for j in i:l.append(choose(imgList,j))res.append(l)return make(res)
def main():wh = input('how many images you want to fill the width and height?(w h):').strip()path = input('please input the directory you save the filling images:').strip()path_ori = input('please input the original image path:').strip()path_save = input('please input the path you want to save the image:').strip()h,w = wh.split(' ')w,h = int(w),int(h)imgList = []for i in os.listdir(path):try:i = os.path.join(path,i)img = Image.open(i)imgList.append(img)except:passimg = Image.open(path_ori)img = img.resize((64 * h,64 * w))res = process(imgList,img,w,h)res.save(path_save)
if(__name__ == '__main__'):main()

代码剖析

from PIL import Image
import numpy as np
import os

导入库

def make(imgMat):img = Image.new("RGB",(64 * len(imgMat),64 * len(imgMat[0])))for i in range(len(imgMat)):for j in range(len(imgMat[i])):imgMat[i][j] = imgMat[i][j].resize((64,64))img.paste(imgMat[i][j],(64 * i,64 * j))return img

imgMat中的图片拼成一张大图片,主要分以下几个步骤 ↓ \downarrow ↓

  1. 创建新的图片
  2. 一张一张粘贴(paste)在这张图片上
def split(img,w,h):mat = []for i in range(h):l = []for j in range(w):box = (64 * i,64 * j,64 * i + 64,64 * j + 64)l.append(img.crop(box))mat.append(l)return mat

img分割成hw列的小图片,主要分以下几个步骤 ↓ \downarrow ↓

  1. 创建一个存放结果的图片矩阵
  2. 从大图片上一张一张的剪(crop)下来
def mean_color(img):r,g,b,*_ = img.split()r = np.array(r)g = np.array(g)b = np.array(b)r = np.mean(r.flatten())g = np.mean(g.flatten())b = np.mean(b.flatten())return r,g,b

求图片的平均颜色,即求图片红的平均值,绿的平均值和蓝的平均值

def distance(img1,img2):r,g,b = mean_color(img1)R,G,B = mean_color(img2)dr,dg,db = R - r,G - g,B - breturn np.sqrt(dr ** 2 + dg ** 2 + db ** 2)

求两张图片的欧几里得距离,可以形象的理解为一个 n n n维的勾股定理。

def choose(imglist,img):mindist = 500minImage = Nonefor i in imglist:dist = distance(i,img)if(dist < mindist):mindist = distminImage = ireturn minImage

从一堆图片里取出一个与img最相似的距离,即求一堆图片中与img欧几里得距离最短的一个

def process(imgList,img,w,h):mat = split(img,w,h)res = []for i in mat:l = []for j in i:l.append(choose(imgList,j))res.append(l)return make(res)

将一个图片分割后去imgList中与其最相近(欧几里得距离最短)的一个,然后再拼接起来

def main():wh = input('how many images you want to fill the width and height?(w h):').strip()path = input('please input the directory you save the filling images:').strip()path_ori = input('please input the original image path:').strip()path_save = input('please input the path you want to save the image:').strip()h,w = wh.split(' ')w,h = int(w),int(h)imgList = []for i in os.listdir(path):try:i = os.path.join(path,i)img = Image.open(i)imgList.append(img)except:passimg = Image.open(path_ori)img = img.resize((64 * h,64 * w))res = process(imgList,img,w,h)res.save(path_save)

输入数据,处理数据,并调用process(点击跳转)函数。

项目github

github传送门

作者

hit-road

拜拜,下课!
回到顶部

祝大家腊八快乐!python 1500张图片画腊八粥相关推荐

  1. 码仔和码妞用19种语言,祝大家中秋快乐

    码个蛋(codeegg)第 739 次推文 码妞手绘了一幅图喔!画得不好请大家见谅! (比如把码仔画胖了,那是他自己胖的 ) 前言 又到了一年一度的中秋佳节,有的已经和家人团聚:有的还在团聚的路上:亦 ...

  2. 薪火数据DataInside祝您腊八节快乐!

    岁末温粥,熙暖如年,愿我们所有人:平安喜乐,万事"粥"全,事事"粥"到--薪火数据DataInside祝您腊八节快乐!

  3. python祝女朋友纪念日快乐

    python祝女朋友纪念日快乐 几天前是本菜鸡程序员与女票的纪念日,本菜鸡苦思冥想,经过两天的不断努力,终于成功做出了一个祝女票纪念日快乐的程序,现在分享给大家,这个程序名就姑且命为<奥特曼爱咸 ...

  4. python光棍节快乐_2020年祝光棍节快乐的祝福语18条

    2020年祝光棍节快乐的祝福语18条 今天是光棍节,作为朋友,我要很负责任很真诚地给你一个郑重的承诺--有我吃肉的时候,绝对就有你啃骨头的时候.光棍节快乐.光棍节不久之后就是圣诞节了,圣诞节送什么礼物 ...

  5. Python——用turtle画一个月饼

    今天是中秋节,首先在这里祝大家中秋快乐!那么提到中秋,我们首先想到的当然是香甜的月饼,所以我今天就在这里画一个月饼送给大家. 那么 要用Python画图,我们必须掌握并运用Turtle库,这个可以自己 ...

  6. 大厂中秋礼盒大PK!祝大家中秋快乐,送大家鹅厂月饼礼盒!

    关注:极客重生,助你成就更好的自己! 图片素材来自:脉脉.知乎.微博等 hi,大家好,今天是中秋放假前最后一天班了,大伙心情是不是很激动呢,平日里,各大公司拼员工拼技术拼实力:到了节日,则要拼奖金.拼 ...

  7. python程序员专用壁纸_程序员炫技必备:用Python生成马赛克画!(文末附源码)...

    原标题:程序员炫技必备:用Python生成马赛克画!(文末附源码) 源 | Python与数据分析文 | 强哥 大家知道马赛克画是什么吗?不是动作片里的马赛克哦~~ 马赛克画是一张由小图拼成的大图,本 ...

  8. python情人节之玫瑰花与表白方式_情人节快乐! python绘制漂亮玫瑰

    情人节快乐!这个节日怎么会少了浪漫的玫瑰花! 用Python的turtle库绘图是很简单的,画了一个玫瑰花,下面奉上源码: 源码: ''' Created on Nov 18, 2017 @autho ...

  9. Python制作字符画(pillow,numpy的使用)

    Python制作字符画 简介:本文讲解,如何使用python制作字符画,这里使用的是pillow和numpy这两个python的库. 字符画: 简单的字符画是利用字符的形状代替图画的线条来构成简单的人 ...

最新文章

  1. java什么时候用list_Java快问快答:用 ArrayList 还是 LinkedList?
  2. 分布式缓存的选择及问题
  3. basicLSTMCELL() num_units参数代表了LSTM输出向量的维数
  4. 【绝对有用】Syntax error on token “throws“, @ expected after this token
  5. PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程
  6. ubuntu快速清理磁盘垃圾
  7. JAVA学习 02Day
  8. TensorFlow中数据读取—如何载入样本
  9. VSCode如何进入到终端中
  10. 在线RGB和HEX十六进制颜色互转工具
  11. 使用Android实现水波纹动画,插件形式可直接引用
  12. Ubuntu16.04安装编译pcl点云库
  13. 50 个高级 sql 语句
  14. [it-ebooks]电子书列表v0.1.1
  15. Python2.7版本的pip下载安装(win7 64位,Python2.7)
  16. 阿里达摩院发布2019十大科技趋势:数字身份将成为第二张身份证
  17. 养老---任重而道远
  18. CG标准函数库——数学函数(GPU编程与CG语言之阳春白雪下里巴人)
  19. IDEA mybatis 用户-订单-订单详情 → 互查
  20. 第11章 菜单及其它资源

热门文章

  1. 关于合泰单片机HT66f2390串口多功能中断的使用
  2. linux redis 查看客户端连接数量,Redis如何处理客户端连接?
  3. 阿里十年大牛神作《Spring响应式微服务实战》让你心服口服!
  4. 【弱监督学习】Weakly Supervised Adversarial Domain Adaptation for Semantic Segmentation in Urban Scenes
  5. VUE进阶(路由等)
  6. 纸机器人的折法_[网络]折纸机器人
  7. 『带你学AI』一文带你搞懂OCR识别算法CRNN:解析+源码
  8. [算法导论] Alpha-Beta 剪枝(Alpha-Beta Pruning)
  9. Revit二次开发之关于外部命令IExternalCommand【比目鱼原创】
  10. js正则验证11位手机号码