程序员没浪漫?
呜呜呜,总是说程序员没有浪漫,谁说的,看我直接做个图片墙不直接拿下?我把她的生活照偷偷的收集起来,然后用python写了一个图片拼器,直接把她拿下!
所用的包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张图片供我们选择能满足我们的需求,但是如果想要替换自己的图片,那么大量图片一定要满足
主体颜色提取算法的优化
我为了验证我的想法是正确的,只是用平均计算了主体的颜色,但发现展示出来效果趋于黑白,可能就是因为图片的数量太少,但是我认为可以找个更好的算法来提取
比如,通过聚类的方式来提取图片的主色调,大概意思就是将色域范围划分开,找出数量最多的色域范围,作为该图片的主色调,如果读者有兴趣可以试一试
总结
看完这些,有的小伙伴就会问了,女朋友到哪领?快去表白吧
多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved