本文可以看作是我的这篇博客(切割过程)的续集。

一、数据说明:

(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)

四、总结

相信各位小伙伴在了解了合并的思路之后,能够很轻松的看懂代码。我的做法并不是按照小图片的文件名所对应的位置来进行的,我的思路比较简单粗暴。如果小伙伴们有什么问题,欢迎私信交流!

将切割后的小图片还原为大图片相关推荐

  1. 小程序加载大图片 使用widthFix时,图片先拉伸然后才显示完全

    <image src="http://www.ll.com/sss.jpg" mode="widthFix" style="width:180r ...

  2. Qt 编程指南 8 显示静态小图片和动态大图片

    显示控件概览 图片浏览示例 第一行是一个标签控件,objectName 为 labelShow,文本内容清空,因为是用来显示图片用的. 主界面第二行的控件是四个普通按钮 第一个按钮文本是 " ...

  3. 怎么压缩jpg图片文件大小?jpg图片格式的压缩方法

    经常写公众号文章的小伙伴,应该遇到过插入jpg图片时失败的情况,这是因为图片超出了平台的上传限制,需要先把过大的图片压缩变小,该怎么压缩jpg图片大小呢?小编来给大家介绍一个jpg格式压缩的方法,使用 ...

  4. 图片缩放 转换bpp 图片合并

    图片缩放 缩放原理: 原图和缩放图内点的位置,在图片中的相对位置不变. 缩放图中每个点的都可以根据图中公式计算出在原图中的位置,然后把原图颜色赋给缩放图.可以用两个for循环复制数据. 函数原型:in ...

  5. jQuery实现等比例缩放大图片让大图片自适应页面布局

    在布局页面时,有时会遇到大图片将页面容器"撑破"的情况,尤其是加载外链图片(通常是通过采集的外站的图片).那么本文将为您讲述使用jQuery如何按比例缩放大图片,让大图片自适应页面 ...

  6. ios手机 苹果手机 在小程序里面长按图片 后 点击事件失效问题

    问题:ios手机 苹果手机 在小程序里面长按图片后,图片悬浮,然后点击事件都失效的问题. 解决办法:在img图片标签里加 css属性 -webkit-touch-callout: none; .如果是 ...

  7. (小甲鱼python)字符串系列笔记合集四 第四课、字符串IV总结 删除字符串中(左右)空格 删除指定的前缀或者后缀 字符串以参数指定的分隔符为依据进行切割,将切割后的结果返回一个三元组

    一.字符串总结四 1.删除字符串中(左右)空格或者与之匹配的字符串 "字符串".lstrip(char=None) 删除左空格 "字符串".rstrip(cha ...

  8. 极验滑块验证码破解与研究(二):缺口图片还原

    极验滑块验证码破解与研究(二):缺口图片还原 声明 一.缺口图片还原js分析 1. 为什么需要还原 2. 本篇文章需要用到的小工具 2.1. reres插件 3. 找到图片还原js入口函数 3.1. ...

  9. 对极验geetest滑块验证码图片还原算法的研究

    免责声明 本文章所提到的技术仅用于学习用途,禁止使用本文章的任何技术进行发起网络攻击.非法利用等网络犯罪行为,一切信息禁止用于任何非法用途.若读者利用文章所提到的技术实施违法犯罪行为,其责任一概由读者 ...

最新文章

  1. 一些有趣的题目(java)持续更新
  2. 七夕节马上到了,有对象的,无对象的必备神奇用Python做一个烟花秀
  3. 职业-把工作当作职业 or 事业?
  4. Python正则表达式之零宽断言(4)
  5. linux线程同步 eventfd,用 eventfd 在线程之间通信
  6. python软件下载3版本-Python 3.7.2和3.6.8版本发布下载,附更新说明
  7. 24. Element namespaceURI 属性
  8. 计算机一级选择题答题技巧,计算机一级考试模拟题内容 答题技巧
  9. Schema指示器(Indicators)
  10. python相对导入常见问题和解决方案
  11. 赵小楼《天道》《遥远的救世主》深度解析(77)叶、冯、刘三人用了丁元英,就用了他的一切,没有能力的时候还谈什么缘,攀缘没有对错,起码得先活着
  12. 公主连结显示服务器内部错误,公主连结进不去怎么办 进不去解决办法
  13. java实现国密加解密
  14. 在使用selenium 做IE自动化操作时 请求状态码 400【帮忙解决或者找出问题所在悬赏200】
  15. 短视频脚本撰写小技巧,不同的短视频类型要使用不同的撰写方法
  16. Anaconda下载simpleITK包和pytorch包
  17. 阿里云IoTStudio中的“移动可视化开发”不见了
  18. NLP 实战 (3) | 整体设计之数据集/模型管理
  19. Mac-如何在任意文件夹下打开终端
  20. 每天一个shell小知识(shell变量)

热门文章

  1. 在VIVADO上实现的非常简易的RISC-V CPU设计(来自《Verilog数字系统设计》夏宇闻著)
  2. 中国传媒大学计算机课程表,中国传媒大学播本课表.pdf
  3. matlab程序 直线插补,无聊写matlab仿真直线插补算法
  4. 【安全知识分享】道路运输机动车驾驶员安全培训(71页)(附下载)
  5. SpringBoot(五)整合Mybatis-Plus
  6. 如何快速的将EXCEL表格数据拆分成多个文件
  7. PHP全站pjax影响收录,zblogPHP增加pjax功能,大写的一个“帅”字 - 胡言乱语
  8. shell脚本——注释(单行注释 多行注释)
  9. 到站提醒APP应用 隐私声明
  10. 地图坐标系之间的转换(百度地图、GCJ、WGS84)