如何用Python实现图像拼接画(把一堆小图拼成大图)

诸神缄默不语-个人CSDN博文目录

在这里的图像拼接画指的是一张大图由很多小图组成,效果就像这样:
在这里插入图片描述

原理:将大图拆成很多小块,每一块计算平均颜色,用平均颜色最相近的小图来替代,就可以。
直接遍历就可以,也就跑几个小时。如果想要加速的话可以考虑研究一下用多线程或者多进程来实现。

注意本博文中涉及的实验都是在Windows平台上实现的,如果要转成其他系统需要尤其注意文件路径格式。

文章目录

  • 1. 预处理小图:计算每张图的平均颜色,并放到一个新的文件夹中
  • 2. 用小图拼大图

1. 预处理小图:计算每张图的平均颜色,并放到一个新的文件夹中

jupyter notebook格式的代码文件:https://github.com/PolarisRisingWar/all-notes-in-one/blob/main/小图拼大图1-计算小图平均RGB颜色.ipynb

我是直接用CIFAR10的图片来作为小图了。

CIFAR10我是之前做PyTorch 60分钟速成的时候就下载过。这个教程我写过笔记:60分钟闪击速成PyTorch(Deep Learning with PyTorch: A 60 Minute Blitz)学习笔记
下载的核心代码是:

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,  download=True, transform=transform)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,  download=True, transform=transform)

代码:
调包→设置参数和工具函数→展示示例图片

import pickleimport numpy as np
import matplotlib.pyplot as pltdef unpickle(file):"""cifar10数据官方提供的导入代码"""with open(file, 'rb') as fo:dict = pickle.load(fo, encoding='bytes')return dict#设置参数
cifar10_path=r'data\cifar-10-batches-py'
cifar10_file_name=[r'\data_batch_'+str(i) for i in range(1,6)]
cifar10_file_name.append(r'\test_batch')cifa10_avgcolor_folder=r"data\cifar10-avgcolor"#展示一张示例图
p='data\cifar-10-batches-py\data_batch_1'
d=unpickle(p)e=d[b'data']
for i in range(100):image=e[i]red_image=image[:1024].reshape(32,32)green_image=image[1024:2048].reshape(32,32)blue_image=image[2048:].reshape(32,32)result_img=np.ones((32, 32, 3), dtype=np.uint8)result_img[:,:,0]=red_imageresult_img[:,:,1]=green_imageresult_img[:,:,2]=blue_imageplt.imshow(result_img)break

在这里插入图片描述

%%time
#遍历所有图片,计算其平均RGB颜色,将其分别存储至对应文件中
for file_name in cifar10_file_name:  #遍历所有batchcifar10_batch=cifar10_path+file_name  #该batch对应的路径cifar10_batch_unpickle=unpickle(cifar10_batch)file_r=open(cifa10_avgcolor_folder+"\\"+file_name+'_r',mode='w')file_g=open(cifa10_avgcolor_folder+"\\"+file_name+'_g',mode='w')file_b=open(cifa10_avgcolor_folder+"\\"+file_name+'_b',mode='w')for picture in cifar10_batch_unpickle[b'data']:file_r.write(str(np.mean(picture[:1024]))+'\n')file_g.write(str(np.mean(picture[1024:2048]))+'\n')file_b.write(str(np.mean(picture[2048:]))+'\n')file_r.close()file_g.close()file_b.close()

2. 用小图拼大图

jupyter notebook格式的代码文件:https://github.com/PolarisRisingWar/all-notes-in-one/blob/main/小图拼大图2.ipynb

大图原始图像是我从网上随便找的一张刘亦菲的写真:
在这里插入图片描述
代码:
调包→设置参数和功能函数→展示大图原图

#导包
import picklefrom PIL import Imageimport numpy as np
import matplotlib.pyplot as pltdef unpickle(file):"""cifar10数据官方提供的导入代码"""with open(file, 'rb') as fo:dict = pickle.load(fo, encoding='bytes')return dict#参数配置
portrait_path=r'liuyifei.jpeg'block=5  #5*5为一个色块#小图
cifar10_path=r'data\cifar-10-batches-py'
cifar10_file_names=[r'\data_batch_'+str(i) for i in range(1,6)]
cifar10_file_names.append(r'\test_batch')cifa10_avgcolor_folder=r"data\cifar10-avgcolor"#展示原图
portrait_picture=Image.open(portrait_path)
plt.imshow(portrait_picture)

在这里插入图片描述

将图片加载到内存中→设置图像拼接的功能函数

#将图片转换为np.ndarray
portrait_matrix=portrait_picture.convert("RGB")
portrait_ndarray = np.array(portrait_matrix)#将小图的RGB加载到内存中
little_rgbs={}
for file_name in cifar10_file_names:with open(cifa10_avgcolor_folder+"\\"+file_name+'_r') as f:little_rgbs[file_name+'_r']=f.readlines()with open(cifa10_avgcolor_folder+"\\"+file_name+'_g') as f:little_rgbs[file_name+'_g']=f.readlines()with open(cifa10_avgcolor_folder+"\\"+file_name+'_b') as f:little_rgbs[file_name+'_b']=f.readlines()#将小图的batch加载到内存中
cifar10_batches=[]
for file_name in cifar10_file_names:  #遍历所有batchcifar10_batch=cifar10_path+file_name  #该batch对应的路径cifar10_batches.append(unpickle(cifar10_batch)[b'data'])def convert_smalls_to_big(block_dim:int):"""将一堆小图转换为大图,入参为大图色块的维度,返回新图"""old_shape=portrait_ndarray.shapeheng_dim=int(old_shape[0]/block_dim)zong_dim=int(old_shape[1]/block_dim)new_picture=np.ndarray(shape=(heng_dim*32,zong_dim*32,3),dtype=np.int16)for i in range(heng_dim):for j in range(zong_dim):old_matrix=portrait_ndarray[i*block_dim:(i+1)*block_dim,j*block_dim:(j+1)*block_dim,:]r=np.mean(old_matrix[:,:,0])g=np.mean(old_matrix[:,:,1])b=np.mean(old_matrix[:,:,2])least_distance=450  #理论最大值应该是np.sqrt(255*255+255*255+255*255)≈442least_distance_batch_index=0least_distance_picture_index=0for index in range(6):#遍历每一个batchfor picture_index in range(len(cifar10_batches[index])):#遍历每一张小图,找到平均RGB跟色块RGB最相近的小图,用这个小图来顶替大图的对应色块little_r=float(little_rgbs[cifar10_file_names[index]+'_r'][picture_index])little_g=float(little_rgbs[cifar10_file_names[index]+'_g'][picture_index])little_b=float(little_rgbs[cifar10_file_names[index]+'_b'][picture_index])distance=np.sqrt((little_r-r)**2+(little_g-g)**2+(little_b-b)**2)if distance<least_distance:least_distance=distanceleast_distance_batch_index=indexleast_distance_picture_index=picture_indexlittle_picture=cifar10_batches[least_distance_batch_index][least_distance_picture_index]new_picture[i*32:(i+1)*32,j*32:(j+1)*32,0]=np.reshape(little_picture[:1024],(32,32)).copy()new_picture[i*32:(i+1)*32,j*32:(j+1)*32,1]=little_picture[1024:2048].reshape(32,32)new_picture[i*32:(i+1)*32,j*32:(j+1)*32,2]=little_picture[2048:].reshape(32,32)plt.imshow(new_picture)plt.savefig("picture1.png")

拼接图像:

%%time
convert_smalls_to_big(block)

Wall time: 1h 23min 27s
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/179841.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CNVD-2021-09650:锐捷NBR路由器(guestIsUp.php)RCE漏洞复现 [附POC]

文章目录 锐捷NBR路由器guestIsUp.php远程命令执行漏洞(CNVD-2021-09650)复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 锐捷NBR路由器guestIsUp.php远程命令执行漏洞(CNVD-2021-09650)复现 [附POC] 0x01 前言 免…

rocketmq5.X 单机搭建 虚拟机搭建rocketmq5.1.4 搭建最新版本mq rocketmq5.1.4版本单体搭建 rocketmq(一)

1. 官网下载地址&#xff1a; 下载 | RocketMQ 2. 配置环境&#xff1a; 我是在/etc/profile.d 新建了一个rocketmq_env.sh 配置了jdk, maven, 以及mq. mq文件下载的 配置完之后&#xff0c;刷新环境source /etc/profile 3. 配置rocket mq 的jvm配置&#xff0c;就是两个启…

LTV预测算法从开发到上线,浅谈基于奇点云DataSimba的MLOps实践

今年8月&#xff0c;StartDT旗下GrowingIO分析云产品客户数据平台&#xff08;CDP&#xff09;正式上线了LTV预测标签。通过开箱即用的标签功能&#xff0c;分析师就能一键生成用户价值的预测结果&#xff0c;用于用户运营和价值分析。 LTV预测标签背后是怎样的算法&#xff1…

RDkit | 安装报错及使用

关于RDKit的学习及介绍&#xff1a; RDKit安装 基础教程&#xff1a;[Getting Started with RDKit in Python] RDkit四&#xff1a;数据处理过程中smiles编码的清洗统一化 reticulate-R Interface to Python 在RStudio中加载 rdkit.Chem和rdkit.Chem.rdmolops 时&#xff0c;报…

内网穿透工具NPS(保姆级教程)

前言&#xff1a; 有时候我们受限于硬件设备和网络的的问题&#xff0c;无法将内网的大容量、高性能存储设备或计算设备对外访问。这个时候就会变的特别苦恼&#xff0c;上云呢成本太大&#xff0c;不用云呢公网又无法直接访问&#xff0c;这个时候怎么办呢&#xff0c;NPS它来…

个人微信机器人接口

请求URL&#xff1a; http://域名地址/modifyGroupName 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRoom…

蓝桥杯每日一题2023.11.15

题目描述 此处的快速排序有一个思想&#xff1a;以一个数x来判定这l至r区间的数的大小&#xff0c;如果a[l]小于x就与右侧的a[r]交换&#xff0c;最后x可以将这个区间的数进行一分为二。填空出就是已经将x移动到左部分和右部分之间&#xff0c;来确定二分的一个界点 答案&…

vue+springboot实现图形验证码Kaptcha

1、前端 form使用了element-ui的组件&#xff0c;主要还是看img标签&#xff0c;src绑定了form.imgCodeUrl数据&#xff0c;点击图片时触发refreshCode更新图片验证码。 <el-form-item prop"verificationCode" label"验证码" style"text-align: l…

DNS服务器典型配置

文章目录 安装主程序bind和安全插件bind-root修改主配置文件/etc/named.conf正向解析 安装主程序bind和安全插件bind-root yum install bind-chroot修改主配置文件/etc/named.conf vim /etc/named.conf将listen-on和allow-query的ip或域名换成any 表示为服务器所有的IP地址启…

为开发GPT-5,OpenAI向微软寻求新融资

11月14日&#xff0c;金融时报消息&#xff0c;OpenAI正在向微软寻求新一轮融资&#xff0c;用于开发超级智能向AGI&#xff08;通用人工智能&#xff09;迈进&#xff0c;包括最新模型GPT-5。 最近&#xff0c;OpenAI召开了首届开发者大会&#xff0c;推出了GPT-4 Turbo、自定…

一本了解生成式人工智能

上周&#xff0c;发了一篇关于大语言模型图数据库技术相结合的文章&#xff0c;引起了很多朋友的兴趣。当然了&#xff0c;这项技术本身就让俺们很兴奋&#xff0c;比如我就是从事图研发的&#xff0c;当然会非常关注它在图领域的应用与相互促就啦。 纵观人类文明历史&#xff…

vmware安装MacOS以及flutter遇到的问题

安装过程&#xff1a;参考下面的文章 链接&#xff1a; 虚拟机VMware安装苹果系统macOS&#xff0c;超级详细教程&#xff0c;附文件下载&#xff0c;真教程&#xff01;&#xff01; 无限重启情况&#xff1a; &#xff08;二&#xff09; 配置虚拟机找到你的虚拟机安装文件…