https://www.bilibili.com/video/av39158788

马赛克拼图介绍:

相片马赛克(Photomosaic),或称蒙太奇照片、蒙太奇拼贴,是一种影像处理的艺术技巧,利用这个方式做出来的图片,近看时是由许多张小照片合在一起的,但远看时,每张照片透过光影和色彩的微调,组成了一张大图的基本像素,就叫做相片马赛克技巧。最先是由一个美国大学生发明的,但当时限于计算机性能,无法大量应用。(来源于维基百科相片相片马赛克)

这是最终得到的效果,如果你的图片集不同,或者参数设置不同,效果也会有差别。

目录

马赛克拼图介绍:

基本原理:

1,收集图片素材

2,图片预处理

3,建立索引

4,画图


基本原理:

对于要绘制的图的每一个像素,都在图像集中找和这个像素RGB值最接近的图像,然后放在这个位置。

下面是我的实现整个工程的步骤:

1,收集图片素材

要做出上述的效果来,首先就需要大量的图片,图片少了,效果肯定不好,容易重复,需要的像素值找不到相近的等等弊端。人工收集图片的话肯定是非常慢的,如果要手工下载图片,那至少要找图片找很多天了。这个时候一般有两个解决途径:

  • 爬取图片

用网络爬虫从别的网站上爬取图片是个不错的选择,也可以用python来实现。

  • 下载图片数据集

网络上有别人已经整理好的图像数据集,我使用的是斯坦福大学李飞飞制作的ImageNet数据集。这个数据集是计算机视觉领域常用的一种数据集,它的训练集大概有100多个G,测试集有10多个G,只是测试集就有10万张图片,够本工程使用了。所以我下载的是他的测试集。网速快的话可以十来分钟就下载下来。

图片数据集的迅雷下载链接

2,图片预处理

由于每张图片的大小不一致,拼图的时候不好处理,所以首先用OpenCV读取每个图片,再把它们的大小都改为100*100。一次更改,使用多次。代码如下:

#coding=utf-8import os#和文件有关的模块
import cv2#OpenCV#这里是10万张图片所在的文件夹,你可以按照你的路径改下面的代码。另外路径好像不支持中文字符。
readPath=r"f:\ILSVRC2012_img_test"#这里是改变大小之后的图片,要保存的路径。save是一个文件夹
savePath=r"f:\save"#用一个列表保存所有的图片的文件名字
files=os.listdir(readPath)#n变量用来看到10万张图片的处理进度。
n=0#遍历所有图片文件们
for file in files:n+=1imgPath=readPath+ "\\" + file#构造图片路径img=cv2.imread(imgPath)#读取图片到内存img变量img=cv2.resize(img,(100,100))#更改图片的大小# 更改之后写入文件,方便以后使用。否则你生成一张马赛克就要处理一次10万张图片cv2.imwrite(savePath+ "\\"+file,img)print(n)cv2.waitKey()

3,建立索引

建立索引就是保存每张图片出现次数最多的像素值然后保存到文件中。格式为:

文件名称:B,G,R

建立好索引文件之后,就可以知道每个图片和他们最常见的颜色。在使用这些图片的时候,就可以读取整个索引文件,然后定位到图片文件本身。试想一下,如果没有这些索引文件,那么生成一次马赛克拼图就要求一次所有图片的最多像素,太多冗余了。下面是代码:

import cv2
import  os
import collectionsreadPath=r"f:\save"
files=os.listdir(readPath)
n=0
s=''
for file in files  :li=[]n+=1imgPath = readPath + "\\" + fileimg=cv2.imread(imgPath)for i in range(100):for j in range(100):b=img[i,j,0]g=img[i,j,1]r=img[i,j,2]li.append((b,g,r))most=collections.Counter(li).most_common(1)s += files += ":"s += str(most[0][0]).replace("(","").replace(")","")s += "\n"print(n)f = open('filename.txt','w')
f.write(s)

生成的索引文件格式是这样的:

4,画图

首先是读取步骤3生成的索引文件。然后可以选择打乱它,以免一样的图片聚集出现在一个位置附近。

假设目标图片是n*m的,那么新建一个n*100,m*100的图片(这里是100的整数倍是因为刚才把图片集中的每个图片都更改为100*100大小的了)。这是一个很大的图片。对于原图片的每个像素,都遍历索引文件,找到和BGR像素值的欧式距离(你也可以采取其他度量方式,甚至可以找最相近的图片,但这样将导致同图片的聚集,因为相邻的像素值很可能一样的)不大于一个阈值的索引文件中的值,然后根据找到的BGR定位到具体的文件,由文件再读取图片,把图片放到大图上的具体位置。下面是具体代码:

import  cv2
import numpy as npreadPath=r"f:\save"def readIndex():fs = open("filename.txt","r")n=0dic=[]for line in fs.readlines():n+=1temp=line.split(":")file=temp[0]bgr=temp[1].split(",")b=int(bgr[0])g=int(bgr[1])r=int(bgr[2])dic.append((file,(b,g,r)))return dicimg=cv2.imread("york.jpg")
s=np.shape(img)
big= np.zeros((100*s[0], 100*s[1], 3), dtype=np.uint8)list=readIndex()#读取索引文件到变量中for i in range(s[0]):#遍历行和列for j in range(s[1]):print(i)b = img[i, j, 0]g = img[i, j, 1]r = img[i, j, 2]#获取图像当前位置的BGR值np.random.shuffle(list)#打乱索引文件for item in list:imgb=item[1][0]imgg=item[1][1]imgr=item[1][2]#获取索引文件的RGB值distance=(imgb-b)**2+(imgg-g)**2+(imgr-r)**2#欧式距离if distance<100:filepath=readPath+"\\"+str(item[0])#定位到具体的图片文件breaklittle=cv2.imread(filepath)#读取整个最相近的图片big[i*100:(i+1)*100,j*100:(j+1)*100]=little#把图片画到大图的相应位置cv2.imwrite("bigYork.jpg",big)#输出大图到文件中

大功告成。

下面是我的时间统计:

  • 下载图片用了三个多小时
  • 图片预处理用了一个多小时
  • 建立索引大概需要一个多小时
  • 之后画每个一万个像素点左右的图片大概需要三分钟的时间

其他链接

用Python和OpenCV实现照片马赛克拼图(蒙太奇照片)相关推荐

  1. TurboMosaic for Mac如何制作个性化的照片马赛克拼图

    由您的家庭照片制作的个性化照片马赛克拼图是您孩子最好的礼物之一. 但是,你怎么能做一个? 在本文中,我们将向您展示如何通过几个简单的步骤制作一个photomosaic拼图. TurboMosaic f ...

  2. 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克

    使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...

  3. python 马赛克拼图_使用 python 做到马赛克拼图

    死宅一枚.爬取5000张二次元妹子的图片,生成了头图. 接下来看看怎么实现的: 使用 Scrapy 框架爬取5000张二次元图 使用 opencv 批量格式化图片 将图片按照RGB值的均方根排序,实现 ...

  4. 马赛克 拼图 python_使用Python的马赛克艺术。

    马赛克 拼图 python In my previous article, I have explored an interesting format of representing images c ...

  5. 使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比)

    使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比) 1. 效果图 1.1 保持宽高比效果图 1.2 忽略宽高比效果图 1.3 opencv各插值效果图 2. 原理 3. 源码 参考 这篇 ...

  6. opengl实现三维动画简单代码_使用Python简单实现马赛克拼图!内附完整代码

    今天小编带大家使用python简单实现马赛克拼图,内容比以往会稍长一些,各位看官老爷可以慢慢细读,若有不足之处还望请斧正,闲话不多说,请看文章. 先看原图: 效果图: 思路: 拼图的原理其实很简单,就 ...

  7. 使用python创造照片马赛克

    使用python创造照片马赛克 一.实验介绍 1.1 实验内容 1.2 实验来源 1.3 实验知识点 1.4 实验环境 二.实验原理 2.1 分割目标图像 2.2 平均颜色值 2.3匹配图像 三.开发 ...

  8. Python小项目—照片马赛克

    项目内容 该项目用Python创建照片马赛克,将目标图像划分成较小图像的网络,并用适当的图像替换网络中的每一小块,创建原始图像的照片的马赛克 项目知识点 用Python图像库(PIL)创建图像 计算图 ...

  9. 如何让图像过渡更自然 python_如何使用Python和OpenCV融合、拼接照片?

    [导读:本文介绍使用Python和OpenCV将两张照片进行加权融合.渐变融合.具有渐变融合效果的拼接等方法] 经常关注本号的朋友可能知道,我常常使用Python和OpenCV将多张照片拼接为一个长图 ...

  10. 炫酷!200 行 Python 代码实现马赛克拼图!

    在一图胜千言的时代,没有什么比一张图片更有冲击力的了,那如果一千张图片拼接起来是什么效果呢? 别问,问就是两字 -- 炫酷! 你有没有想过上面的图片是怎么实现的,难道这是用 ps 一张张拼起来的?当然 ...

最新文章

  1. 企业云桌面-06-安装数据库服务器-051-vCdb01
  2. 虚拟机Linux下解决ping时出现 unknown host问题
  3. 【深度学习】编写同时在PyTorch和Tensorflow上工作的代码
  4. 冰雪奇缘,白色世界:四个IT人的四姑娘山双桥沟游记
  5. 重塑自己的语音 笔记1
  6. 斗地主AI算法——第八章の被动出牌(2)
  7. python数据结构之匿名函数lambda
  8. 什么是智能门锁,智能门锁主要有哪些优点?
  9. Rplidar学习(二)—— SDK库文件学习
  10. 小哥哥教你100%安装Win10专业版永久激活版(全网独一无二)
  11. 计算机硬盘上的文件打不开,电脑硬盘打不开怎么办
  12. 庖丁解牛Transformer原理
  13. python最小二乘法拟合实例
  14. Jude——用例图和活动图
  15. 配置ntp客户端与服务器端时间的同步
  16. ISP(二) Demosiac 去马赛克 (CIP)
  17. 如何打通企业数据,实现数智化转型
  18. 墨云saas系统总结
  19. Unity打IOS版本遇到的问题(总)
  20. 详解 pcap_findalldevs_ex

热门文章

  1. 关于人工智能(AI),【西部世界】提供一点小想法
  2. 发现了吗?西部世界III在Broadway上的广告
  3. /etc/hosts 详解
  4. 费纳姆密码-二进制密码
  5. hdu5208 Where is Bob 数位dp
  6. android网络权限动态,Android权限详解(含6.0动态申请)
  7. Excel设置数据有效性实现单元格下拉菜单的3种方法
  8. 多种参数的BCH、RS码和(2,1,6)卷积码编码的MATLAB仿真实现
  9. ESX通过命令行重启虚拟机
  10. 阿里巴巴2021校招