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获取Windows或Linux主机名称通用函数分享
Nov 22 Python
Python下使用Psyco模块优化运行速度
Apr 05 Python
python绘制双柱形图代码实例
Dec 14 Python
使用Django和Python创建Json response的方法
Mar 26 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
Python代码需要缩进吗
Jul 01 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 Python
Python和Bash结合在一起的方法
Nov 13 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
我的群发邮件程序
2006/10/09 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
thinkphp的静态缓存用法分析
2014/11/29 PHP
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
python实现用于测试网站访问速率的方法
2015/05/26 Python
简单理解Python中的装饰器
2015/07/31 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
建筑实习自我鉴定
2013/10/18 职场文书
企业为何需要商业计划书
2013/12/26 职场文书
运动会跳远广播稿
2014/02/04 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
消防安全主题班会
2015/08/12 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
《海上日出》教学反思
2016/02/23 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
pandas中关于apply+lambda的应用
2022/02/28 Python