这效果实在是不知道该怎么描述…

放一张著名的海报(楚门的世界),大概就这意思。


放大看细节:

正好大计课上提到了 opencv,顺便搞一下。

假设,我们已经通过一顿操作获得了相同尺寸的背景图(bg)和前景图(fg),那么一个自然的想法就是把图片加权合并起来。

# 合并图片
cv2.addWeighted(fg, alpha, bg, beta, gamma)
# alpha,beta 分别代表权重,gamma 代表合成图片的偏移量(也就是明暗)

但是经过实操,这样做效果并不好。画面的协调性很差,背景和前景对比度都很低,看不清楚。

第二个想法就是用小照片拼前景的时候,根据背景的色调把它放在相应的位置上。那么现在我们需要计算两张子图的“色调差”一类的东西,在 opencv 里可以通过计算和比较直方图(histogram)来完成。灰度图的直方图就是计算在每个灰度区间里的像素个数,RGB 的直方图可以任意选定某一通道。

# 计算直方图
hist = cv2.calcHist([img], [0], None, [64], [0, 256])
# 参数顺次为:图片,通道(灰度即为[0],BGR为[0/1/2]),掩模图像,分组数目,像素值范围
# 注意用中括号括起来

而对于直方图的比较,opencv 提供了三种比较方式:

相关性比较 ,method = cv.HISTCMP_CORREL, 值越大,相关度越高,最大值为 1,最小值为 0
卡方比较,method = cv.HISTCMP_CHISQR ,值越小,相关度越高,最大值无上界,最小值 0
巴氏距离比较,method = cv.HISTCMP_BHATTACHARYYA,值越小,相关度越高,最大值为 1,最小值为 0

但这个相关性比较范围应该是有问题,我跑出来的是 [-1, 1]。至于这几种比较在操作中实际有什么区别我并不清楚,反着我采用了巴氏距离。

# 比较直方图
temp = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)

完成了这第二步成片效果还是难以接受。在直接加权的方法下,前景和北京的对比度似乎不能够同时被满足。

通过分析上面的海报,发现它的背景好像不是刻意直接加权上去的,而是主要由前景的主色调自然拼凑成的,类似于马赛克的形式。所以我觉得最重要的区别就是我的图片太少了,不能满足背景对色调的要求。

最后我采用的方法是对背景的每一格进行模糊处理,使之形成大色块,通过抹除细节的方式使前景的呈现更为清晰。

# 均值模糊
img = cv2.blur(img, (a, b))
# a, b 表示取均值的范围

背景图局部效果:

受图片数量的限制,最终效果当然远不及上面的海报,但也只能这样了。

成片就不放了。

完整代码:

import cv2 as cv
import os, random
import numpy as npsize = width, height = 200, 150
row, col = 48, 48
images = []
hists = []
used = []def initialize():print("Resizing, please wait...")readPath = "images0"savePath = "images1"filenames = os.listdir(readPath)for i, filename in enumerate(filenames):img = cv.imread(readPath + '\\' + filename)img = cv.resize(img, size)cv.imwrite(savePath + '\\' + filename, img)img = cv.imread("background0.jpg")img = cv.resize(img, (width * col, height * row))cv.imwrite("background1.jpg", img)print("All images have been resized!")def calcHists():print("Calculating histograms, please wait...")readPath = "images1"filenames = os.listdir(readPath)for i, filename in enumerate(filenames):img = cv.imread(readPath + '\\' + filename)images.append(img)img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)hists.append(cv.calcHist([img], [0], None, [64], [0, 256]))used.append(0)print("All histograms have been calculated!")def solve():bg = cv.imread("background1.jpg")newbg = cv.imread("background1.jpg")for i in range(0, height * row, height):for j in range(0, width * col, width):now = cv.cvtColor(bg[i: i + height, j: j + width, 0: 3], cv.COLOR_BGR2GRAY)nowHist = cv.calcHist([now], [0], None, [64], [0, 256]) # 计算该单元背景的直方图ttt = bg[i: i + height, j: j + width, 0: 3]ttt = cv.blur(ttt, (200, 200))          # 模糊化该单元背景newbg[i: i + height, j: j + width, 0: 3] = tttminimum = 1for k, img in enumerate(images):        # 找色调最统一的if used[k]:continuetemp = cv.compareHist(hists[k], nowHist, cv.HISTCMP_BHATTACHARYYA) if temp < minimum + 1e-9:minimum = tempindex = kbg[i: i + height, j: j+ width, 0: 3] = images[index]used[index] = 1cv.imwrite("final.jpg", bg)cv.imwrite("newbg.jpg", newbg)if __name__ == "__main__":initialize()calcHists()solve()fg = cv.imread("final.jpg")bg = cv.imread("newbg.jpg")final = cv.addWeighted(fg, 0.5, bg, 0.5, 0)cv.imwrite("final3.jpg", final)

用opencv把小照片合成大照片相关推荐

  1. 千张照片合成你一张美照-【OpenCV实战二】

    如果你手头有很多很多她的照片,想要给她一个惊喜,你一定要知道这篇文章的威力! OpenCV图像处理其中经典的案例就是千图合成技术,通过对于不同图像的特征提取,再拼合成指定的图像.快去给你的她也搞一个吧 ...

  2. 照片太大如何压缩变小?

    照片太大如何压缩变小?解决这个问题前我们要了解为什么照片会太大?简单的说就是相机在拍照时速度非常快,所以拍摄出来的照片,是没有经过压缩的原照片,从而会占用很大的内存.其次,随着人们品质的提升,对相机的 ...

  3. 照片太大怎么压缩变小一点,分享5个简单方法

    照片太大怎么压缩变小一点?遇到这个情况是很正常的,因为电脑或者手机中的照片太大的话,在聊天工具中是无法进行传输的.而且照片过大的话,也会占用我们手机和电脑的内存,这样会使我们的电脑或手机速度越来越慢, ...

  4. 照片太大,照片如何压缩变小?

    照片太大,照片如何压缩变小?随着自媒体时代的来临,越来越多的人用照片记录生活,把拍好的照片上传到各个社交媒体平台,供自己和他人的娱乐欣赏.在上传的时候经常会出现因照片太大导致无法上传的情况发生,这个时 ...

  5. 照片合成动态图片的方法

    经常能够看到网上有很多的gif动图都是由拍摄的照片合成起来的效果,那么如果想要自己制作这种合成照片(一键合成高清gif动图-在线gif制作工具-gif.cn_GIF中文网)类型的gif动图该如何制作呢 ...

  6. 使用Python+OpenCV将照片变成卡通照片

    正如你可能知道的,素描或创建一个卡通并不总是需要手动完成.如今,许多应用程序可以把你的照片变成卡通照片.但是如果我告诉你,你可以用几行代码创造属于自己的效果呢? 有一个名为OpenCV的库,它为计算机 ...

  7. three.js和Canvas合作实现照片合成从而实现全景材质的制作

    本人近期在研究three.js的全景制作,其中由于个人非没事专业所以对图片资源的合成出现了大量的问题,所以转向的用代码解决的方向.经过本人多方请教和查阅终于找到了通往成功的道路. 话不多说上代码 &l ...

  8. 照片浏览器_2020护考报名失败!只因照片太大瞎忙乎三小时...

    有一位小姐姐给小编留言说,只因为填写工作单位的时候少了一个"班"字...而报名失败,把自己的惨痛经历发到抖音,点赞都超700!你在报名的时候还遇到哪些奇葩的事情,也可以给小编留言, ...

  9. 一寸照片多大?你知道一寸照片的尺寸吗?

    一寸照片多大?相信大家在日常生活中都会经常使用到各种各样的证件照,而一寸证件照就是其中的一种.一寸照片是2.5厘米乘以3.5厘米,像素尺寸295 X 413px.很多时候我们需要使用到证件照了,我们的 ...

最新文章

  1. virtio驱动_0020 virtio-blk简易驱动
  2. html定位fix,html 定位fixed
  3. Costco的中国门徒已经参透了零售成功秘笈
  4. hbase数据读取优化_read读取优化_HBase最佳实践_HBase开发指南_云数据库 HBase - 阿里云...
  5. 三维坐标绕轴坐标旋转公式
  6. Layer 引入自定义模块
  7. C++随机数生成器(default_random_engine)
  8. 前序、中序、后序遍历的基础详解
  9. 用易语言对DNF卡顿进行批处理
  10. 中柏平板刷linux教程,中柏 ezpad 平板安装Fedora 21 (Linux)
  11. Visual Studio Installer 一直提取文件0B不动怎么办:修改DNS教程
  12. 服务器属于三大系统,服务器三大操作系统
  13. 模型检测--工具PRISM
  14. SKU 和 SPU 有什么区别?
  15. 查看Oracle数据库实例启动状态
  16. transform 属性 实现3D立体相册
  17. check mk 监控 oracle
  18. swoole 捕捉php错误,常见错误 - swoole - yoyo
  19. 高德地图1008INVALID_USER_SCODE错误
  20. 谷歌Chrome浏览器低延迟(低于500ms)播放海康威视、浙江大华RTSP解决方案(演示视频)

热门文章

  1. Unity自学第一天, 新手小白进!写一个最简单的脚本让方块旋转起来
  2. 小旋风蜘蛛池,小旋风蜘蛛池程序,小旋风站群
  3. 这个AI换脸算法,让马斯克也体验了一把当钢铁侠——SberSwap算法
  4. mysql 高并发下查询很慢_MySQL-高并发优化
  5. tiny4412裸板程序之点灯(一)
  6. 在线视频流播放控制(优酷、土豆、酷六、音乐台)
  7. 2013年主流小尺寸Android平板终极横评
  8. 亚马逊运营主管有哪些岗位要求和能力要求?
  9. 电压频率转换电路(集成运放)
  10. C语言五子棋禁手算法的编写,基于C语言的五子棋辅助软件的设计与实现.doc