使用OpenCV拼接图片,表白神器,我靠它成功找对来女朋友

使用OpenCV拼接图片,表白神器,我靠它成功找对来女朋友

程序员没浪漫?

呜呜呜,总是说程序员没有浪漫,谁说的,看我直接做个图片墙不直接拿下?我把她的生活照偷偷的收集起来,然后用Python写了一个图片拼器,直接把女朋友看哭了

所用的包

  • cv2处理图片的包
  • matpltlib图片展示包
  • numpy矩阵处理包

看看效果

在这里插入图片描述
在这里插入图片描述

有了它女朋友看哭了

代码实现

import cv2
import matplotlib.pyplot as plt
import numpy as np

# 读入你自己的原图
im = cv2.imread('111.jpg', cv2.IMREAD_COLOR)
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
im_h,im_w,im_c = im.shape

import collections
import random

# 从cifar中读入数据,将每张图片的平均像素值作为这些照片的key,那么我们通过key就可以直接通过像素快速找到自己想要替换的照片
import pickle
pixel_dict = collections.defaultdict(list)
with open('./cifar-10-batches-py/data_batch_1', 'rb') as f:
    imgs = pickle.load(f, encoding='bytes')[b'data']
for img in imgs:
    pixel = int(np.average(img))
    pixel_dict[pixel].append(img.reshape((3, 32, 32)).transpose((1,2,0)))

# 使用28*28的图片进行拼接
joint_img = np.empty((32*im_h, im_w*32, 3)).astype('float32')
pre_pixel = None
print(joint_img.shape)
for h_index, pixel_h in enumerate(np.mean(im, axis=2)):
    for w_index, pixel_w in enumerate(pixel_h):
        choice_pixel = pixel_dict[int(pixel_w)]
        if not choice_pixel:
            choice_pixel = pre_pixel
        else:
            pre_pixel = choice_pixel
        im_pixel = random.choice(choice_pixel)
        joint_img[h_index*32:(h_index+1)*32, w_index*32:(w_index+1)*32] = im_pixel

# 保存
plt.imsave('a.jpg', joint_img/255., cmap='gray')

问题

图片过大

如果图片很大那么拼接出来的图片就是会非常大,项目中的实例图片是4004003的,如果每个像素值通过28*28的图片进行替换,那么大小可想而知,最后项目得到的结果图为100m左右

需要大量替换图片

本项目是通过平均像素值进行替换的,能大概计算出替换图片的主体颜色,如果图片数量不足那么像素值找不到对应替换那么我们的照片就会变成马赛克,虽然本项目已经对这一点做了一些处理,cifar10有6w张图片供我们选择能满足我们的需求,但是如果想要替换自己的图片,那么大量图片一定要满足

主体颜色提取算法的优化

我为了验证我的想法是正确的,只是用平均计算了主体的颜色,但发现展示出来效果趋于黑白,可能就是因为图片的数量太少,但是我认为可以找个更好的算法来提取
比如,通过聚类的方式来提取图片的主色调,大概意思就是将色域范围划分开,找出数量最多的色域范围,作为该图片的主色调,如果读者有兴趣可以试一试

总结

看完这些,有的小伙伴就会问了,女朋友到哪领?快去表白吧 😄

注意

项目需要大量内存,如果图片过大请到AI studio平台运行此项目

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值