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输出当前目录下index.html文件路径的方法
Apr 28 Python
python动态网页批量爬取
Feb 14 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
python运行其他程序的实现方法
Jul 14 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
Django实现跨域的2种方法
Jul 31 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
Django 返回json数据的实现示例
Mar 05 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
Python读写锁实现实现代码解析
Nov 28 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新手上路(五)
2006/10/09 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
jquery validate poshytip 自定义样式
2012/11/26 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
九步学会Python装饰器
2015/05/09 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
Django如何批量创建Model
2020/09/01 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
在家更换处方镜片:Lensabl
2019/05/01 全球购物
大学毕业生自我鉴定
2013/11/05 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
Python使用MapReduce进行简单的销售统计
2022/04/22 Python