一、前言

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

二、效果展示

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

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

三、代码实现

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

获取颜色的主色调列表

遍历底图的每个像素块

在色调列表中寻找与当前色调块最相近的图片

将图片修改大小后粘贴到当前遍历的色调块

保存图片

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

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*3

dif = 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_im

j += box_w

i += 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色块图_美翻你的朋友圈,Python生成蒙太奇马赛克图片相关推荐

  1. 美翻你的朋友圈,Python生成蒙太奇马赛克图片

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

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

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

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

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

  4. python恶搞图_搞几款由“Python”语言编写的“有趣、恶搞、好玩”的程序代码!...

    分享一:"啥是佩奇?"让Python语言告诉你 用Python代码创作一副佩奇: # coding:utf-8 import turtle as t t.pensize(4) t. ...

  5. 成本相差5384倍,编程用C++和Python!马斯克如何搞翻航天圈

    成本相差5384倍,编程用C++和Python!马斯克如何搞翻航天圈 有一本英文书<马斯克:世界上最酷的人>的作者曾经连续跟着马斯克很久,才有了这本著作.他说,马斯克之所以能够成功,是因为 ...

  6. 写【Python折线图】的一百个技巧(一、生成折线图网页)

    写[Python折线图]的一百个技巧(一.生成折线图网页) 目录 写[Python折线图]的一百个技巧(一.生成折线图网页) 前言 学习环境 Python库环境 探究目标 绘制过程 引入库 初始化数据 ...

  7. python 两点曲线_十行代码,用Python做一个迷你版的美图秀秀

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

  8. 用python画皇冠_手把手教你用 Python 绘制酷炫的桑基图!

    原标题:手把手教你用 Python 绘制酷炫的桑基图! 作者 | 周志鹏 责编 | 郭 芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看! ...

  9. python画图宽度_手把手教你用 Python 绘制酷炫的桑基图!

    作者 | 周志鹏 责编 | 郭   芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" ...... 笔者本没有 ...

最新文章

  1. vue缓存页面【二】
  2. 环境调试: RuntimeWarning: Couldn‘t find ffmpeg or avconv - defaulting to ffmpeg, but may not work warn(“
  3. 098 Validate Binary Search Tree 验证二叉搜索树
  4. python清洗数据用什么包_格式化和清洗数据的Python工具包
  5. super go_Go 简单性的价值:来自对 Go 倍加青睐的谷歌软件工程师的自述
  6. python人工智能pdf_800G人工智能学习资料:AI电子书+Python语言入门+教程+机器学习等限时免费领取!...
  7. nginx: [error] invalid PID number问题处理
  8. 在MNIST图像上训练卷积神经网络
  9. java简单增删改查_JAVA JDBC 简单的增删改查
  10. python心跳包原理_Python 用心跳(UDP包)探测不活动主机
  11. 【Beam Search】seq2seq中的beam search算法过程
  12. 一周信创舆情观察(2.21~2.27)
  13. scratch编程小游戏咬指大冒险
  14. 计算机键盘锁不了怎么办,笔记本电脑键盘没反应是哪个键锁了?该怎么办
  15. 华硕路由架设php,华硕 RT-AC68U 路由模式默认 VLAN
  16. 如何下载网页上的视频?
  17. 计算机的用户终端,计算机终端、客户端、服务端都是什么概念,他们之间的区别是什么?谢谢,大家,小弟是菜鸟...
  18. 3蛋白wb_99% 的实验小白都会收藏,WB、ELISA、IHC 进阶攻略
  19. ipad/iphone内存管理二
  20. WordPress主题分享:Flatsome主题v3.15.7免费下载 2022年最新版

热门文章

  1. 微信登陆电脑失败是什么情况?
  2. [转载]复杂网络研究机构与大牛
  3. html jq随机换背景,JQuery随机背景颜色和颜色,2 div
  4. Android(二)之Android布局
  5. 淘宝天猫官方订单和商品接口操作
  6. 华为荣耀20和x10比较_华为畅享20Pro和荣耀X10哪个好 看完区别对比后就懂了
  7. 数据库考试之-数据结构
  8. 我爱赚钱吧:建网站赚钱②
  9. 百分百教你学会安装配置VMware虚拟机
  10. html中a href /a的用法