将切割后的小图片还原为大图片
本文可以看作是我的这篇博客(切割过程)的续集。
一、数据说明:
(1)原始大图片:6000*6000
(2)小图片:512*512,且相邻小图片之间的重叠率为50%
(3)根据切割的要求,原图共被分割为140个小图片,即10行14列。
二、还原思路
(1)先将每一行的小图片还原为一条完整的图片,如下图:
第一行分割得到的14个小图片:
第一行还原得到的完整图片:
(2)按照上述方法,将10行小图片全部还原成完整的图片:
第一行:
第二行:
第三行:
……
……
……
第十行:
(3)再将第一行到第十行的条状图片拼接为一个完整的大图片。
三、上代码
代码中的注释写的很清晰明了,希望可以帮助到小伙伴们!
import os
import sys
import re
import math
from shutil import copyfile
from PIL import Image
result="F:/Practice/merge.png"#用于存放最终合并生成的图像
#将image.png切块得到的140个小块,按着每一行为一个文件夹划分,也就是把每一行的14个小图片单独放在一个文件夹里
origin_path = 'F:/Practice/test02/Images_01_res/'
result_path= 'F:/Practice/merge_res/'
filelist = os.listdir(origin_path)for i in range(len(filelist)):fileName = filelist[i] # '1.png'name=re.split('_',fileName)f_cls=int(name[4])fileClass = "image_row"+str(f_cls) filePath = result_path + fileClass + '/' src_fileName = origin_path + fileNametar_fileName = filePath + fileNameif not os.path.exists(filePath):os.makedirs(filePath)copyfile(src_fileName,tar_fileName)#定义水平连接函数
def join_horizontal(i,png1, png2, size):img1, img2 = Image.open(png1), Image.open(png2)size1, size2 = img1.size, img2.size # 获取两张图片的大小loc1, loc2 = (0, 0), (size1[0]-size,0)a=size1[0]+size2[0]-sizeif a > 6000:a=6000loc1, loc2 = (0, 0), (5488,0)joint = Image.new('RGB', (a, size1[1]))joint.paste(img2, loc2)joint.paste(img1, loc1)joint.save('F:/Practice/rows/row{}.png'.format(i))#定义竖直连接函数
def join_vertical(png1, png2, size):img1, img2 = Image.open(png1), Image.open(png2)size1, size2 = img1.size, img2.size # 获取两张图片的大小loc1, loc2 = (0, 0), (0,size1[1]-size)a=size1[1]+size2[1]-sizeif a > 6000:a=6000loc1, loc2 = (0, 0), (0,5488) joint = Image.new('RGB', (size1[0],a))joint.paste(img2, loc2)joint.paste(img1, loc1)joint.save(result)#定义开始执行水平连接的函数
def start(i,items, size, first_path=None):# 当first为None时,默认将第一张图片设置为图片列表的第一张图片,第二张图片设置为图片列表的第二张# 当这两张图片合成后,将图片列表的已经合成的图片元素移除# 然后将合成的图片设置为第一张图片,将剩余的没有合成的图片列表继续操作# 当first_path不为None,将第一张图片设置为first_path,第二张图片设置为传进来的列表的第一个元素# 合成之后,将刚刚使用的列表的元素删除# 最后递归函数,直到列表为空try:if not first_path:path1, path2 = items[0], items[1]join_horizontal(i,path1, path2, size)items.remove(path1)items.remove(path2) return start(i,items, size, first_path='F:/Practice/rows/row{}.png'.format(i))else:path2 = items[0]join_horizontal(i,first_path, path2, size)items.remove(path2)return start(i,items, size, first_path='F:/Practice/rows/row{}.png'.format(i))except:pass#定义开始执行竖直连接的函数
def ver_start(items, size, first_path=None):try:if not first_path:path1, path2 = items[0], items[1]join_vertical(path1, path2, size)items.remove(path1)items.remove(path2)return ver_start(items, size, first_path=result)else:path2 = items[0]join_vertical(first_path, path2, size)items.remove(path2)return ver_start(items, size, first_path=result)except:pass#定义抓取path路径下所有文件的函数
def getAllImg(path):result = []filelist = os.listdir(path)for file in filelist:if os.path.isfile(os.path.join(path, file)):if file.split('.')[1] in ('jpg', 'png'):result.append(os.path.join(path, file))return result#在result文件夹下,创建一个image_rows文件夹,用于存放合并生成的每一行图片
rows_path= 'F:/Practice/rows'
if not os.path.exists(rows_path):os.makedirs(rows_path)# #在result文件夹下,创建一个label_rows文件夹,用于存放合并生成的每一行图片
# rows_path= 'F:/Practice/test_01/result/label_rows'
# if not os.path.exists(rows_path):
# os.makedirs(rows_path)
#将每一个row[i]文件夹下的小块水平合并成完整的一行图片,合并的结果存放在上一步创建的image_rows文件夹下
if __name__ == '__main__':for i in range(1,13):path='F:/Practice/row_dirs/image_row{}/'.format(i) s = getAllImg(path)
# print(s)s.sort(key=lambda x:int(x[51:-4]))start(i,s, 0)
#将rows文件夹下存放的合成得到的每一行图片,竖直合并成完整的图像
if __name__ == '__main__':path1="F:/Practice/rows/"s1=getAllImg(path1)s1.sort(key=lambda x:int(x[20:-4]))
# print(s1)ver_start(s1, 0)print('最后图片尺寸--->', Image.open(result).size)
四、总结
相信各位小伙伴在了解了合并的思路之后,能够很轻松的看懂代码。我的做法并不是按照小图片的文件名所对应的位置来进行的,我的思路比较简单粗暴。如果小伙伴们有什么问题,欢迎私信交流!
将切割后的小图片还原为大图片相关推荐
- 小程序加载大图片 使用widthFix时,图片先拉伸然后才显示完全
<image src="http://www.ll.com/sss.jpg" mode="widthFix" style="width:180r ...
- Qt 编程指南 8 显示静态小图片和动态大图片
显示控件概览 图片浏览示例 第一行是一个标签控件,objectName 为 labelShow,文本内容清空,因为是用来显示图片用的. 主界面第二行的控件是四个普通按钮 第一个按钮文本是 " ...
- 怎么压缩jpg图片文件大小?jpg图片格式的压缩方法
经常写公众号文章的小伙伴,应该遇到过插入jpg图片时失败的情况,这是因为图片超出了平台的上传限制,需要先把过大的图片压缩变小,该怎么压缩jpg图片大小呢?小编来给大家介绍一个jpg格式压缩的方法,使用 ...
- 图片缩放 转换bpp 图片合并
图片缩放 缩放原理: 原图和缩放图内点的位置,在图片中的相对位置不变. 缩放图中每个点的都可以根据图中公式计算出在原图中的位置,然后把原图颜色赋给缩放图.可以用两个for循环复制数据. 函数原型:in ...
- jQuery实现等比例缩放大图片让大图片自适应页面布局
在布局页面时,有时会遇到大图片将页面容器"撑破"的情况,尤其是加载外链图片(通常是通过采集的外站的图片).那么本文将为您讲述使用jQuery如何按比例缩放大图片,让大图片自适应页面 ...
- ios手机 苹果手机 在小程序里面长按图片 后 点击事件失效问题
问题:ios手机 苹果手机 在小程序里面长按图片后,图片悬浮,然后点击事件都失效的问题. 解决办法:在img图片标签里加 css属性 -webkit-touch-callout: none; .如果是 ...
- (小甲鱼python)字符串系列笔记合集四 第四课、字符串IV总结 删除字符串中(左右)空格 删除指定的前缀或者后缀 字符串以参数指定的分隔符为依据进行切割,将切割后的结果返回一个三元组
一.字符串总结四 1.删除字符串中(左右)空格或者与之匹配的字符串 "字符串".lstrip(char=None) 删除左空格 "字符串".rstrip(cha ...
- 极验滑块验证码破解与研究(二):缺口图片还原
极验滑块验证码破解与研究(二):缺口图片还原 声明 一.缺口图片还原js分析 1. 为什么需要还原 2. 本篇文章需要用到的小工具 2.1. reres插件 3. 找到图片还原js入口函数 3.1. ...
- 对极验geetest滑块验证码图片还原算法的研究
免责声明 本文章所提到的技术仅用于学习用途,禁止使用本文章的任何技术进行发起网络攻击.非法利用等网络犯罪行为,一切信息禁止用于任何非法用途.若读者利用文章所提到的技术实施违法犯罪行为,其责任一概由读者 ...
最新文章
- 一些有趣的题目(java)持续更新
- 七夕节马上到了,有对象的,无对象的必备神奇用Python做一个烟花秀
- 职业-把工作当作职业 or 事业?
- Python正则表达式之零宽断言(4)
- linux线程同步 eventfd,用 eventfd 在线程之间通信
- python软件下载3版本-Python 3.7.2和3.6.8版本发布下载,附更新说明
- 24. Element namespaceURI 属性
- 计算机一级选择题答题技巧,计算机一级考试模拟题内容 答题技巧
- Schema指示器(Indicators)
- python相对导入常见问题和解决方案
- 赵小楼《天道》《遥远的救世主》深度解析(77)叶、冯、刘三人用了丁元英,就用了他的一切,没有能力的时候还谈什么缘,攀缘没有对错,起码得先活着
- 公主连结显示服务器内部错误,公主连结进不去怎么办 进不去解决办法
- java实现国密加解密
- 在使用selenium 做IE自动化操作时 请求状态码 400【帮忙解决或者找出问题所在悬赏200】
- 短视频脚本撰写小技巧,不同的短视频类型要使用不同的撰写方法
- Anaconda下载simpleITK包和pytorch包
- 阿里云IoTStudio中的“移动可视化开发”不见了
- NLP 实战 (3) | 整体设计之数据集/模型管理
- Mac-如何在任意文件夹下打开终端
- 每天一个shell小知识(shell变量)
热门文章
- 在VIVADO上实现的非常简易的RISC-V CPU设计(来自《Verilog数字系统设计》夏宇闻著)
- 中国传媒大学计算机课程表,中国传媒大学播本课表.pdf
- matlab程序 直线插补,无聊写matlab仿真直线插补算法
- 【安全知识分享】道路运输机动车驾驶员安全培训(71页)(附下载)
- SpringBoot(五)整合Mybatis-Plus
- 如何快速的将EXCEL表格数据拆分成多个文件
- PHP全站pjax影响收录,zblogPHP增加pjax功能,大写的一个“帅”字 - 胡言乱语
- shell脚本——注释(单行注释 多行注释)
- 到站提醒APP应用 隐私声明
- 地图坐标系之间的转换(百度地图、GCJ、WGS84)