python 马赛克拼图_用Python和OpenCV实现照片马赛克拼图(蒙太奇照片)
马赛克拼图介绍:
相片马赛克(Photomosaic),或称蒙太奇照片、蒙太奇拼贴,是一种影像处理的艺术技巧,利用这个方式做出来的图片,近看时是由许多张小照片合在一起的,但远看时,每张照片透过光影和色彩的微调,组成了一张大图的基本像素,就叫做相片马赛克技巧。最先是由一个美国大学生发明的,但当时限于计算机性能,无法大量应用。(来源于维基百科相片马赛克)
这是最终得到的效果,如果你的图片集不同,或者参数设置不同,效果也会有差别。
目录
基本原理:
1,收集图片素材
2,图片预处理
3,建立索引
4,画图
基本原理:
对于要绘制的图的每一个像素,都在图像集中找和这个像素RGB值最接近的图像,然后放在这个位置。
下面是我的实现整个工程的步骤:
1,收集图片素材
要做出上述的效果来,首先就需要大量的图片,图片少了,效果肯定不好,容易重复,需要的像素值找不到相近的等等弊端。人工收集图片的话肯定是非常慢的,如果要手工下载图片,那至少要找图片找很多天了。这个时候一般有两个解决途径:
爬取图片
用网络爬虫从别的网站上爬取图片是个不错的选择,也可以用python来实现。
下载图片数据集
网络上有别人已经整理好的图像数据集,我使用的是斯坦福大学李飞飞制作的ImageNet数据集。这个数据集是计算机视觉领域常用的一种数据集,它的训练集大概有100多个G,测试集有10多个G,只是测试集就有10万张图片,够本工程使用了。所以我下载的是他的测试集。网速快的话可以十来分钟就下载下来。图片数据集的迅雷下载链接
2,图片预处理
由于每张图片的大小不一致,拼图的时候不好处理,所以首先用OpenCV读取每个图片,再把它们的大小都改为100*100。一次更改,使用多次。代码如下:
#coding=utf-8
import 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+=1
imgPath=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 collections
readPath=r"f:\save"
files=os.listdir(readPath)
n=0
s=''
for file in files :
li=[]
n+=1
imgPath = readPath + "\\" + file
img=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 += file
s += ":"
s += str(most[0][0]).replace("(","").replace(")","")
s += "\n"
print(n)
f = open('filename.txt','w')
f.write(s)
生成的索引文件格式是这样的:
文件名:R,G,B比如
1.png:200,3,69
4,画图
首先是读取步骤3生成的索引文件。然后可以选择打乱它,以免一样的图片聚集出现在一个位置附近。
假设目标图片是n*m的,那么新建一个n*100,m*100的图片(这里是100的整数倍是因为刚才把图片集中的每个图片都更改为100*100大小的了)。这是一个很大的图片。对于原图片的每个像素,都遍历索引文件,找到和BGR像素值的欧式距离(你也可以采取其他度量方式,甚至可以找最相近的图片,但这样将导致同图片的聚集,因为相邻的像素值很可能一样的)不大于一个阈值的索引文件中的值,然后根据找到的BGR定位到具体的文件,由文件再读取图片,把图片放到大图上的具体位置。下面是具体代码:
import cv2
import numpy as np
readPath=r"f:\save"
def readIndex():
fs = open("filename.txt","r")
n=0
dic=[]
for line in fs.readlines():
n+=1
temp=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 dic
img=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])#定位到具体的图片文件
break
little=cv2.imread(filepath)#读取整个最相近的图片
big[i*100:(i+1)*100,j*100:(j+1)*100]=little#把图片画到大图的相应位置
cv2.imwrite("bigYork.jpg",big)#输出大图到文件中
大功告成。
下面是我的时间统计:下载图片用了三个多小时
图片预处理用了一个多小时
建立索引大概需要一个多小时
之后画每个一万个像素点左右的图片大概需要三分钟的时间
---------------------
作者:York1996
来源:CSDN
原文:https://blog.csdn.net/york1996/article/details/81664849
python 马赛克拼图_用Python和OpenCV实现照片马赛克拼图(蒙太奇照片)相关推荐
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- python 概率分布模型_使用python的概率模型进行公司估值
python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...
- python自动拼图_一种更高效的M*N拼图自动还原算法解析
一, 导语 拼图游戏很适合休闲放松的时候玩,所以在上大学的一段时间里,我比较喜欢玩,用来打发无聊的时光. 恰巧2016年李世石与阿尔法狗对弈,虽然我不懂围棋,但也跟着围观了每场比赛.当时我想既然下围棋 ...
- python医学图像读取_对python读取CT医学图像的实例详解
需要安装OpenCV和SimpleItk. SimpleItk比较简单,直接pip install SimpleItk即可. 代码如下: #coding:utf-8 import SimpleITK ...
- python集群_使用Python集群文档
python集群 Natural Language Processing has made huge advancements in the last years. Currently, variou ...
- python 网页编程_通过Python编程检索网页
python 网页编程 The internet and the World Wide Web (WWW), is probably the most prominent source of info ...
- python机器学习预测_使用Python和机器学习预测未来的股市趋势
python机器学习预测 Note from Towards Data Science's editors: While we allow independent authors to publish ...
- python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合
本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...
- python移动图形工作站_让Python跑得更快
原标题:让Python跑得更快 点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 Tips 参与文末话题讨论,即有机会获得异步图书一本. Python很容易学.你之所以阅读本 ...
- python 免费空间_用python做大数据
不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...
最新文章
- SAP RETAIL供应商寄售库存跨公司转移后的库存状况
- 3.playbook基础
- 2016 版 Laravel 系列入门教程(一)
- 以太坊“拿下”世界银行(WB)!7300万美元债券将在下周完成结算
- 项目进度管理:控制进度
- java简易日历程序报告_简单的日历小程序(java编写)
- apache.camel_Apache Camel 3.1 –更多骆驼核心优化(第3部分)
- 143. 最大异或对
- MyCat分布式数据库集群架构工作笔记0015---高可用_负载均衡_Mycat双主双从读写分离
- easyui 的 toolbar配合图标使用
- 敏捷开发相关概念——学习笔记
- 拓端tecdat|在R语言中显示美丽的数据摘要summary统计信息
- Python穷举法破解密码
- 中国人民大学与加拿大女王大学金融硕士让你在疫情下的学习有更多的选择
- 分享一些实用的手机应用
- 【随便搞搞】自己写了一个用于炒股软件的自动选股分析代码 0603更新 天齐锂业两个板出局
- pythonfillcolor填充不了颜色_如何在matplotlib 2.0中仅使用图案填充(无背景色)填充区域...
- 单引号,双引号,转义
- java 常用英语单词
- 中国联通北斗国星卡,终身免话费+流量费,网友:全都是套路
热门文章
- 计算机网络.第三节课.笔记.信道复用、频分复用、统计时分复用、波分复用、时分复用、码分复用、双绞线带宽、双绞线
- HDU 1880魔咒词典
- Spark 的一些名词术语
- 直流屏电源模块GF22007-2高频充电模块R22007
- c语言一个数平方表示,C语言 - 利用 汇编思想 写一个数的平方
- 简述力法计算弹性固定无铰拱的原理_力法读书笔记
- DeepFM算法详解-推荐算法中的皇冠
- uniapp 调用原生插件包含第三方SDK时抛NoClassDefFoundError异常
- python123第九周_我的python学习之路-基础3
- 物理学四大神兽!今分享一些有意思的东西~~