一、前言

我们有时候会听到这么一个词–“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生各个镜头单独存在时所不具有的特定含义。这就是我们经常听到了蒙太奇手法,在电影《飞屋环游记》中皮克斯运用蒙太奇手法,用一个不到5分钟的短片展现了主角的大半人生,感动无数观众。下面我们就看看今天的内容同蒙太奇有何关系。

二、效果展示

说这么多都是虚的,下面我们看看效果实现的效果,到底什么是蒙太奇马赛克图片,这里用小松菜奈的照片作为测试:

最左边的是蒙太奇图缩小的效果,第二个则是正常大小显示的效果,第三张是原图,第四张是截取的某个区域的细节。从图四可以很容易看出,我们的蒙太奇图片是使用许多不同的图片拼接而成的。

三、代码实现

程序的实现分为几个步骤,首先我们需要准备工作,一个是我们的底图,也就是上面的图三。另外就是需要一个图片集,这个图片集的选取有几个规范,首先不能有gif图和png图片,其次就是图片的颜色尽量丰富,图片数量也多一些,这样效果会更好。另外就是选取长宽比接近1的图片效果会更好。然后就是我们代码部分的工作了:

  1. 图片预处理
  2. 获取颜色的主色调列表
  3. 遍历底图的每个像素块
  4. 在色调列表中寻找与当前色调块最相近的图片
  5. 将图片修改大小后粘贴到当前遍历的色调块
  6. 保存图片

大家对于上面的步骤或许还有些疑问,这些疑问在具体实现中细说。先看看我们要用到的一些模块:

import os
import cv2
import math
import numpy as np

其中opencv的安装如下:

pip install opencv-python

3.1、图片预处理

人工挑图片还是比较麻烦的,所以我们只要求人先挑好一些图片,然后我们将不符合规范的图片删除即可:

def renameImages(path)://获取图片路径列表filelist = [path + i for i in os.listdir(path)]//用数字给图片命名img_num = str(len(filelist))name = int(math.pow(10, len(img_num)))//遍历列表for file in filelist://删除gif和png图片if file.endswith('.gif') or file.endswith('.GIF') or file.endswith('.png') or file.endswith('.PNG'):os.remove(file)continue# 对图片以数字编号重命名os.rename(file, path + str(name) + '.jpg')name += 1

执行上面的方法后我们就把合适的图片筛选出来了。

3.2、获取颜色的主色调列表

获取主色调列表前我们需要先获取主色调,这里直接使用bgr值的平均值作为主色调:

def getDominant(im):"""获取主色调"""b = int(round(np.mean(im[:, :, 0])))g = int(round(np.mean(im[:, :, 1])))r = int(round(np.mean(im[:, :, 2])))return (b, g, r)

通常RGB模式的图片我们接触的比较多,但是在OpenCV中图片是以BGR模式读取,每个字母的含义是一样的,只是顺序不同,这里需要注意一下。接下来我们获取主色调列表:

def getColors(path):"""获取图片列表的色调表"""colors = []# 获取图片列表filelist = [path + i for i in os.listdir(path)]# 遍历列表for file in filelist:# 读取图片im = cv2.imdecode(np.fromfile(file, dtype=np.uint8), -1)try:# 获取图片主色调dominant = getDominant(im)except:continue# 将主色调添加到色调列表中colors.append(dominant)return colors

有了色调列表,我们对比颜色的操作就可以直接同色调列表进行了。

3.3、寻找主色调最接近的图片

我是通过比较两张图片主色调的BGR值,然后将差的绝对值相加的方式获得色调的差异:

def fitColor(color1, color2):"""返回两个颜色之间的差异大小"""# 求出b通道之间的差异b = color1[0] - color2[0]# 求出g通道之间的差异g = color1[1] - color2[1]# 求出r通道之间的差异r = color1[2] - color2[2]# 返回绝对值的和return abs(b) + abs(g) + abs(r)

3.4、遍历,寻找并粘贴

这里就是我们的方法主体了,内容比较多,我们先看看代码:

def generate(im_path, imgs_path, box_size, multiple=1):"""生成图片"""# 读取图片列表img_list = [imgs_path + i for i in os.listdir(imgs_path)]# 读取图片im = cv2.imread(im_path)im = cv2.resize(im, (im.shape[1]*multiple, im.shape[0]*multiple))# 获取图片宽高width, height = im.shape[1], im.shape[0]# 遍历图片像素for i in range(height // box_size+1):for j in range(width // box_size+1):# 图块起点坐标start_x, start_y = j * box_size, i * box_size# 初始化图片块的宽高box_w, box_h = box_size, box_size# 截取当前遍历到的图块box_im = im[start_y:, start_x:]if i == height // box_size:box_h = box_im.shape[0]if j == width // box_size:box_w = box_im.shape[1]if box_h == 0 or box_w == 0:continue# 获取主色调dominant = getDominant(im[start_y:start_y+box_h, start_x:start_x+box_w])img_loc = 0# 差异,同主色调最大差异为255*3dif = 255 * 3# 遍历色调表,查找差异最小的图片for index in range(colors.__len__()):if fitColor(dominant, colors[index]) < dif:dif = fitColor(dominant, colors[index])# 色调列表同图片列表的位置是一致的,所以我们获取色调下标即可img_loc = index# 读取差异最小的图片,img_list[img_loc]为差异最小的图片box_im = cv2.imdecode(np.fromfile(img_list[img_loc], dtype=np.uint8), -1)# 转换成合适的大小box_im = cv2.resize(box_im, (box_w, box_h))# 铺垫色块im[start_y:start_y+box_h, start_x:start_x+box_w] = box_imj += box_wi += box_h# 返回结果图return im

首先我们看看传入的参数都是什么含义:

im_path  : 底图的路径
imgs_path : 图片列表的根目录
box_size : 像素块的大小
multiple=1 : 图片的缩放大小,默认为1

前面两个参数非常好理解。对于box_size参数的解释就是效果图四种,每张照片的尺寸,因为我全部以正方形处理,所以只有一个大小。而multiple参数则是缩放大小,当我们底图为50*50没有设置缩放时,结果图也是50*50,当我们将缩放设置为2,结果图则为100*100。因为图片太小的话看不到像素块中的图片,所以利用缩放让效果更好,但是缩放值设置过大的话图片内存会大许多。其它部分的解释都在代码中了。最后再给大家看一张效果图:

因为事先效果不是非常乐观,所以给大家看一张朦胧的效果图。感兴趣的读者可以关注我的个人公众号:ZackSock。如果觉得文章有帮助可以动动小手点个赞哈~

美翻你的朋友圈,Python生成蒙太奇马赛克图片相关推荐

  1. 公众号 自动生成海报 python_美翻你的朋友圈,Python生成蒙太奇马赛克图片

    一.前言 我们有时候会听到这么一个词--"蒙太奇",但却不知道这个词是什么意思.蒙太奇原为建筑学术语,意为构成.装配.而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生 ...

  2. python色块图_美翻你的朋友圈,Python生成蒙太奇马赛克图片

    一.前言 我们有时候会听到这么一个词--"蒙太奇",但却不知道这个词是什么意思.蒙太奇原为建筑学术语,意为构成.装配.而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生 ...

  3. 美翻朋友圈:用Python生成蒙太奇马赛克图片

    题图 | 视觉中国 来源 | ZackSock(ID:ZackSock) 我们有时候会听到这么一个词--"蒙太奇",但却不知道这个词是什么意思.蒙太奇原为建筑学术语,意为构成.装配 ...

  4. Python生成随机高斯模糊图片

    Python可以使用opencv库很方便地生成模糊图像,如果没有安装opencv的,可以用pip安装: pip install python-opencv 想了解高斯模糊是什么的话,可以看wiki百科 ...

  5. python用*号输出字母c的图案_第1.6题:使用Python生成字母验证码图片

    题目来自:Python 练习册.题目1.6:使用 Python 生成类似于下图中的字母验证码图片 查看更多于本人博客:李飞阳 参考代码 我们用随机颜色填充背景,再画上文字,最后对图像进行模糊,得到验证 ...

  6. Python生成带圆角图片的二维码

    示例代码1 #!/usr/bin/python # -*- coding: UTF-8 -*- # author: Carl time:2020/5/15import qrcode from PIL ...

  7. python实现蒙太奇马赛克效果

    1. 实验简介 相片马赛克(Photomosaic),或称蒙太奇照片.蒙太奇拼贴,是一种影像处理的艺术技巧,利用这个方式做出来的图片,近看时是由许多张小照片合在一起的,但远看时,每张照片透过光影和色彩 ...

  8. Python生成透明背景图片

    转载请注明出处:http://blog.csdn.net/jinixin/article/details/79115782 关于画图,Python不乏许多优秀的第三方库能支持操作图片,比如Matplo ...

  9. 小白都看得懂的使用Python生成随机验证码图片,以及后续优化方案

    环境:Anaconda3-2020.02 首先我们分解一下需要做什么: 生成随机的字母字符串 生成生成随机的背景色 生成随机的字体颜色 把随机的字符串用随机的颜色渲染,然后放到一块随机的背景色上面,基 ...

最新文章

  1. Openstack 小知识点
  2. SAP移动类型103解析
  3. Java中泛型Class T, T与Class ?
  4. KM 最优匹配 讲解
  5. 《Python Cookbook 3rd》笔记(4.12):不同集合上元素的迭代
  6. 真香!8 行代码搞定最大子数组和问题
  7. 廖雪峰java教程 pdf_廖雪峰java学习笔记.pdf
  8. Python 的切片语法为什么不会出现索引越界呢?
  9. 手机通过WiFi控制电脑
  10. DevOps-SRE岗位到底是什么?
  11. linux 安卓 挂pt,如何挂PT: Ubuntu / CentOS 7安装Deluge
  12. FM860-GI工业级摄像头安装驱动
  13. Unity MMO游戏架构设计之角色设计一
  14. 企业微信机器人脚本python_Python实现企业微信机器人每天定时发消息实例
  15. 剪映导出帧率选多少_剪映帧率|剪映帧率是什么 剪映帧率在哪设置_234游戏网
  16. Win7 时间不准不能自动同步,执行w32tm /register发生下列错误: 拒绝访问(0x80070005)
  17. Storm Windowing(翻译)
  18. js中数组插入、删除元素操作
  19. 中国蚁剑下载时,出现“无法成功完成操作,文件包含病毒或潜在的垃圾软件”报错的解决方案
  20. CVR预估模型ESMM

热门文章

  1. 视频处理之浮雕效果【附源码】
  2. 勒索病毒解密SQL数据库修复文档文件服务器中毒远程处理数据恢
  3. 分布式系统的知识点-架构设计
  4. 爬虫三(Bs4搜索、Selenium基本使用、无界面浏览器、Selenium自动登录百度案例、自动获取12306登录验证码案例、切换选项卡、浏览器前进后退、登录Cnblogs获取Cookie自动点赞)
  5. PowerDC进行电源DC仿真
  6. uniapp 清除文件缓存
  7. R语言排序的基本函数
  8. CodeForces - 1324 D. Pair of Topics 思维+多解法
  9. 娱美德举办WEMIX空投活动以庆祝《传奇M》在全球发布!
  10. FER基于卷积神经网络: 处理少量数据和训练样本订单FER with CNN:Coping with few data and the training sample order