马赛克(蒙太奇)图片生成

观察上面一张图我们可以发现,图片大致为一个蒙娜丽莎的画像,但是又有些不太一样。图片由一个个块组成,每一个块都是一张另外的图片,那么要实现这样的效果,我们应该怎样做呢?用一句话来概括就是将计算目标图片中的不同的数据集中源图片的相似度,选择相似度最高的进行替换。

假设图片是RGB三通道的,我们可以分别求出来的三个通道的均值,然后再比较源图片三通道数值之间的欧式距离,卡方距离或者其它距离,最终完成比较和替换。

import cv2
import os
import matplotlib.pyplot as plt
import numpy as np
import math
from scipy.spatial.distance import jensenshannon
from scipy.spatial.distance import euclidean
from scipy.spatial.distance import hamming
from scipy.spatial.distance import correlation
from tqdm import trange# get the pic to be compared
def load_comp_image(img_path, step1, step2):this_source_comp_img = []for filename in os.listdir(img_path):img = np.array(cv2.imread(img_path + "/" + filename))comp_img = cv2.resize(img, (step1, step2))this_source_comp_img.append(comp_img)this_source_comp_img = np.array(this_source_comp_img)return this_source_comp_img# get the source image
def load_src_image(img_path, step1, step2):this_source_img = []for filename in os.listdir(img_path):img = cv2.imread(img_path + "/" + filename)this_source_img.append(cv2.resize(img, (step1, step2)))this_source_img = np.array(this_source_img)return this_source_img# get the target image
def load_target_image(img_path, num_row, num_col):img = np.array(cv2.imread(img_path))img_reshaped = cv2.resize(img, (num_row, num_col))return img_reshaped# down sampling
def down_sampling_graph(image):image = cv2.pyrDown(image)return image# calculate the distance of the source picture and target picture
def get_dis_pic(src_pic, tar_pic):src_pic_2 = np.zeros((500, step1, step2, 3))count = 0big_pic = np.zeros((my_num_row, my_num_col, 3))for i in trange(0, my_num_row, step1):for j in range(0, my_num_col, step2):dist = float('inf')tmp = np.array(tar_pic[i:i + step1, j:j + step2])for k in range(0, len(src_pic)):means1, stddev1 = cv2.meanStdDev(tmp)means2, stddev2 = cv2.meanStdDev(src_pic[k])# euclidean# distance = abs(means1[0] - means2[0]) + abs(means1[1] - means2[1]) \#            + abs(means1[2] - means2[2])# Chi Squaredistance = abs(means1[0] - means2[0]) ** 2 / (means1[0] + means2[0]) \+ abs(means1[1] - means2[1]) ** 2 / (means1[1] + means2[1]) \+ abs(means1[2] - means2[2]) ** 2 / (means1[2] + means2[2])# hamming# distance = jensenshannon(means1, means2)if dist > distance:dist = distancebig_pic[i:i + step1, j:j + step2] = src_pic[k]return big_picif __name__ == "__main__":my_num_row = 1500my_num_col = 1500step1 = 10step2 = 10tar_img = load_target_image('natural_test.jpg', my_num_row, my_num_col)source_img = load_src_image("./assignment1/CS303 Dataset for assignment 1/natural_training", step1, step2)final_pic = get_dis_pic(source_img, tar_img)final_pic = cv2.resize(final_pic, (1698, 1131))cv2.imwrite('natural_chisquare_avg.jpg', final_pic)

我们可以选择一张图片来看看效果

原本的图片:

生成的马赛克图片:

从效果来看还是不错的

马赛克(蒙太奇)图片生成--Python实现相关推荐

  1. Python批量导入图片生成能治疗颈椎病的HTML5版课件

    本文要点:Python文件操作,HTML5的figure元素和CSS3属性的用法. 说明:1):本文图片来自于相关阅读中Python批量导出多个PPT/PPTX文件中每个幻灯片为独立JPG图片或Pyt ...

  2. python批量导入图片_Python批量导入图片生成PowerPoint 2007+文件

    原标题:Python批量导入图片生成PowerPoint 2007+文件 说明:本文是"Python批量爬取微信公众号文章中的图片"的后续文章,用来把从公众号批量抓取的图片还原为P ...

  3. liunx+python+django框架实现图片生成二维码

    点击箭头处"蓝色字",免费领测试技术及面试资料! 余生皆欢喜 liunx+python+django框架实现二维码生成器 首先我简单的介绍下django:django官网解释就是如 ...

  4. python图片保存为txt文件_python实现对文件中图片生成带标签的txt文件方法

    在深度学习中经常需要生成带标签的图片名称列表,xxxlist.txt文件,下面写一个简单的python脚本生成该文件列表. import os def generate(dir,label): fil ...

  5. linux 非root 安装ImageMagick 以及python调用ImageMagick将图片生成gif案例

    标题有点长,知识量拉满~ 首先进入链接 http://www.imagemagick.org/script/install-source.php 下载 下载ImageMagick.tar.gz ,下载 ...

  6. github 头像生成 java_GitHub - haoziiy/avatar_generator: 头像图片生成器 Python代码

    avatar_generator 哈希头像图片生成器 Python代码 Identicon 在很多大型IT网站上可以见到,比如 Github, Sourceforge, Stackoveflow 等等 ...

  7. 前端线上图片生成马赛克

    前言 说起图片的马赛克,可能一般都是由后端实现然后传递图片到前端,但是前端也是可以通过canvas来为图片加上马赛克的,下面就进行一个简单的实现. 思路 最开始需要实现马赛克功能是需要通过canvas ...

  8. python图片生成gif方法汇总

    一.使用 PIL 和 images2gif 库 第一种方法主要是采用PIL和imagegif库,由于版本的原因,可能有的imagegif对图片进行处理的时候,以下语句会报错 writeGif(outf ...

  9. python制作图片数据集,Python 3 生成手写体数字数据集

    0.引言 平时上网干啥的基本上都会接触验证码,或者在机器学习学习过程中,大家或许会接触过手写体识别/验证码识别之类问题,会用到手写体的数据集: 自己尝试写了一个生成手写体图片的python程序,在此分 ...

最新文章

  1. MVC系列1-MVC基础
  2. idea自动生成方法注释(含参数及返回值)
  3. 渲染管道(3)几何阶段二“坐标转换”
  4. 科大星云诗社动态20220106
  5. Run service in specified proxyPort via jettyrun
  6. 变形监测期末复习_寒假即将来临,中小学期末考试时间是什么时候?
  7. if循环java语句_java-条件判断和循环语句
  8. php怎么使用插件下载,怎么使用下载的jquery插件
  9. java activemq 断线_activemq 长时间没有消息client会断开吗?
  10. 【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(2)
  11. DFS和BFS算法框架
  12. linux mq发送测试消息,MQ消息队列搭建命令及方法
  13. Mybatis-plus代码生成器
  14. flutter无法抓包
  15. 华为matebook X 笔记本没开什么程序,有时经常慢卡
  16. 奇数值结点链表(C语言实现)
  17. 【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)
  18. Element UI Table表格样式调整
  19. document onload和window onload的区别?
  20. 动态分析之OllyDbg

热门文章

  1. 2021年高考成绩查询无为二中,清北保送生公示:安徽仅3人,2021年安徽985录取率还会垫底吗?...
  2. 【UE4】UE4框选
  3. Win32应用程序开发:完整的开发流程
  4. 【惨遭被裁】985毕业,依然过不好这一生
  5. canvas绘图有锯齿毛边问题的解决
  6. Unity 音频合并
  7. NIXIE_TUBE
  8. 拓扑排序(topo_sort)
  9. 易语言 超文本浏览框
  10. python-套接字基础与 UDP 通信