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实现巡检系统(solaris)示例
Apr 02 Python
Python3写入文件常用方法实例分析
May 22 Python
Android分包MultiDex策略详解
Oct 30 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
May 13 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
简述python Scrapy框架
Aug 17 Python
python设置中文界面实例方法
Oct 27 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
pytorch实现手写数字图片识别
May 20 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
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
discuz的php防止sql注入函数
2011/01/17 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
一个tab标签切换效果代码
2009/03/27 Javascript
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
innerText 使用示例
2014/01/23 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
python获取mp3文件信息的方法
2015/06/15 Python
Python中Numpy mat的使用详解
2019/05/24 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
简单了解python反射机制的一些知识
2019/07/13 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
JAVA代码查错题
2014/10/10 面试题
保护环境倡议书300字
2014/05/19 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
Golang连接并操作MySQL
2022/04/14 MySQL
SQLServer常见数学函数梳理总结
2022/08/05 MySQL