Python 实现将大图切片成小图,将小图组合成大图的例子


Posted in Python onMarch 14, 2020

训练keras时遇到了一个问题,就是内存不足,将 .fit 改成 .fit_generator以后还是放不下一张图(我的图片是8192×8192的大图==64M)。于是解决方法是将大图切成小图,把小图扔去训练,跑出来的图再拼成一个大图

实验发现我的keras(win10 - 16G内存)只放得下最多4副小图(2048×2048×4==16M),

再多就会报错exit :

Allocation of 4831838208 exceeds 10% of system memory.

原因大概是除了numpy本身要存这些图,keras训练中也会对应有额外的消耗

一、大图切片成小图

'''
读入一个图片0.bmp,切成指定数目个小图片(16个)
文件夹名out
'''
from PIL import Image
import sys,os
cut_num = 4 # 4*4=16个图片
#将图片填充为正方形
def fill_image(image):
  width, height = image.size  
  #选取长和宽中较大值作为新图片的
  new_image_length = width if width > height else height  
  #生成新图片[白底]
  #new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white')  
  new_image = Image.new(image.mode, (new_image_length, new_image_length))
  #将之前的图粘贴在新图上,居中 
  if width > height:#原图宽大于高,则填充图片的竖直维度
  #(x,y)二元组表示粘贴上图相对下图的起始位置
    new_image.paste(image, (0, int((new_image_length - height) / 2)))
  else:
    new_image.paste(image, (int((new_image_length - width) / 2),0))  
  return new_image
#切图
def cut_image(image):
  width, height = image.size
  item_width = int(width / cut_num)
  box_list = []  
  # (left, upper, right, lower) 
  for i in range(0,cut_num):#两重循环,生成图片基于原图的位置 
    for j in range(0,cut_num):      
      #print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
      box = (j*item_width,i*item_width,(j+1)*item_width,(i+1)*item_width)
      box_list.append(box)

  image_list = [image.crop(box) for box in box_list]  
  return image_list
#保存
def save_images(image_list):
  index = 1 
  for image in image_list:
    image.save('out/'+str(index) + '.bmp', 'BMP')
    index += 1

if __name__ == '__main__':
  file_path = "0.bmp"
  os.mkdir("out")
  image = Image.open(file_path)  
  #image.show()
  image = fill_image(image)
  image_list = cut_image(image)
  save_images(image_list)

二、随机截取指定大小的图

'''
随即截取指定大小的图片
'''
import os
import cv2
import random
 
#读取图片
img1=cv2.imread('0.bmp')
img2=cv2.imread('1.bmp')
 
#h、w为想要截取的图片大小
h=2048
w=2048
 
save_dir1 = "pic_train/"
save_dir2 = "pic_noise/"
if os.path.exists(save_dir1) is False:
  os.makedirs(save_dir1)
if os.path.exists(save_dir2) is False:
  os.makedirs(save_dir2)
count=0
while 1:
  #随机产生x,y 此为像素内范围产生
  y = random.randint(0, 6144)
  x = random.randint(0, 6144)
  #随机截图
  cropImg1 = img1[(y):(y + h), (x):(x + w)]
  cropImg2 = img2[(y):(y + h), (x):(x + w)]
  cv2.imwrite(save_dir1 + str(count) + '.bmp', cropImg1)
  cv2.imwrite(save_dir2 + str(count) + '.bmp', cropImg2)
  count+=1
 
  if count==100:
    break

三、小图组合成大图

'''
将指定文件夹里面的图片拼接成一个大图片
'''
import PIL.Image as Image
import os
 
IMAGES_PATH = 'out\\' # 图片集地址
IMAGES_FORMAT = ['.bmp', '.BMP'] # 图片格式
IMAGE_SIZE = 2048 # 每张小图片的大小
IMAGE_ROW = 4 # 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_COLUMN = 4 # 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_SAVE_PATH = 'final.bmp' # 图片转换后的地址
 
# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
        os.path.splitext(name)[1] == item]
 
# 简单的对于参数的设定和实际图片集的大小进行数量判断
if len(image_names) != IMAGE_ROW * IMAGE_COLUMN:
  raise ValueError("合成图片的参数和要求的数量不能匹配!")
 
# 定义图像拼接函数
def image_compose():
  to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE)) #创建一个新图
  # 循环遍历,把每张图片按顺序粘贴到对应位置上
  for y in range(1, IMAGE_ROW + 1):
    for x in range(1, IMAGE_COLUMN + 1):
      from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize(
        (IMAGE_SIZE, IMAGE_SIZE),Image.ANTIALIAS)
      to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))
  to_image = to_image.convert('L')
  return to_image.save(IMAGE_SAVE_PATH) # 保存新图
image_compose() #调用函数

注意文件名的数字顺序,00 01 02 ...11 12 13 ....这样

以上这篇Python 实现将大图切片成小图,将小图组合成大图的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 代码性能优化技巧分享
Aug 07 Python
Android应用开发中Action bar编写的入门教程
Feb 26 Python
Python 多线程抓取图片效率对比
Feb 27 Python
python实现发送邮件功能代码
Dec 14 Python
基于Python实现的ID3决策树功能示例
Jan 02 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
详解python的argpare和click模块小结
Mar 31 Python
谈一谈基于python的面向对象编程基础
May 21 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
python如何实现DES加密
Sep 21 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 #Python
python matplotlib 绘图 和 dpi对应关系详解
Mar 14 #Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 #Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 #Python
使用Python爬取弹出窗口信息的实例
Mar 14 #Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 #Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 #Python
You might like
php实现将上传word文件转为html的方法
2015/06/03 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
原生js事件的添加和删除的封装
2014/07/01 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
JQuery判断正整数整理小结
2017/08/21 jQuery
浅析java线程中断的办法
2018/07/29 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
python定时器使用示例分享
2014/02/16 Python
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
python 元组和列表的区别
2020/12/30 Python
python中二分查找法的实现方法
2020/12/06 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
教室标语大全
2014/06/21 职场文书
工作收入证明模板
2014/10/10 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
2015初中团委工作总结
2015/07/28 职场文书
少先队中队工作总结
2015/08/14 职场文书
高中数学教学反思范文
2016/02/18 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
在redisCluster中模糊获取key方式
2021/07/09 Redis