训练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训练中也会对应有额外的消耗

一、大图切片成小图

  1. '''
  2. 读入一个图片0.bmp,切成指定数目个小图片(16个)
  3. 文件夹名out
  4. '''
  5. from PIL import Image
  6. import sys,os
  7. cut_num = 4 # 4*4=16个图片
  8. #将图片填充为正方形
  9. def fill_image(image):
  10. width, height = image.size
  11. #选取长和宽中较大值作为新图片的
  12. new_image_length = width if width > height else height
  13. #生成新图片[白底]
  14. #new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white')
  15. new_image = Image.new(image.mode, (new_image_length, new_image_length))
  16. #将之前的图粘贴在新图上,居中
  17. if width > height:#原图宽大于高,则填充图片的竖直维度
  18. #(x,y)二元组表示粘贴上图相对下图的起始位置
  19. new_image.paste(image, (0, int((new_image_length - height) / 2)))
  20. else:
  21. new_image.paste(image, (int((new_image_length - width) / 2),0))
  22. return new_image
  23. #切图
  24. def cut_image(image):
  25. width, height = image.size
  26. item_width = int(width / cut_num)
  27. box_list = []
  28. # (left, upper, right, lower)
  29. for i in range(0,cut_num):#两重循环,生成图片基于原图的位置
  30. for j in range(0,cut_num):
  31. #print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
  32. box = (j*item_width,i*item_width,(j+1)*item_width,(i+1)*item_width)
  33. box_list.append(box)
  34.  
  35. image_list = [image.crop(box) for box in box_list]
  36. return image_list
  37. #保存
  38. def save_images(image_list):
  39. index = 1
  40. for image in image_list:
  41. image.save('out/'+str(index) + '.bmp', 'BMP')
  42. index += 1
  43.  
  44. if __name__ == '__main__':
  45. file_path = "0.bmp"
  46. os.mkdir("out")
  47. image = Image.open(file_path)
  48. #image.show()
  49. image = fill_image(image)
  50. image_list = cut_image(image)
  51. save_images(image_list)

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

  1. '''
  2. 随即截取指定大小的图片
  3. '''
  4. import os
  5. import cv2
  6. import random
  7.  
  8. #读取图片
  9. img1=cv2.imread('0.bmp')
  10. img2=cv2.imread('1.bmp')
  11.  
  12. #h、w为想要截取的图片大小
  13. h=2048
  14. w=2048
  15.  
  16. save_dir1 = "pic_train/"
  17. save_dir2 = "pic_noise/"
  18. if os.path.exists(save_dir1) is False:
  19. os.makedirs(save_dir1)
  20. if os.path.exists(save_dir2) is False:
  21. os.makedirs(save_dir2)
  22. count=0
  23. while 1:
  24. #随机产生x,y 此为像素内范围产生
  25. y = random.randint(0, 6144)
  26. x = random.randint(0, 6144)
  27. #随机截图
  28. cropImg1 = img1[(y):(y + h), (x):(x + w)]
  29. cropImg2 = img2[(y):(y + h), (x):(x + w)]
  30. cv2.imwrite(save_dir1 + str(count) + '.bmp', cropImg1)
  31. cv2.imwrite(save_dir2 + str(count) + '.bmp', cropImg2)
  32. count+=1
  33.  
  34. if count==100:
  35. break

三、小图组合成大图

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

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

Python - 工具:将大图切片成小图,将小图组合成大图的更多相关文章

  1. 6个炫酷又好用的 Python 工具,个个都很奔放呀

    贝多芬写完<第九交响曲>后说:it's done:耶稣在被处死前说:it is done:<指环王>结尾摧毁魔戒后Frodo说:it's done! 我整理完这6个Python ...

  2. 开源方案搭建可离线的精美矢量切片地图服务-8.mapbox 之sprite大图图标文件生成(附源码)

    项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...

  3. WOE1-Feature Selection 相关:一个计算WOE和Information Value的python工具

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  4. 专为渗透测试人员设计的 Python 工具大合集

    如果你对漏洞挖掘.逆向工程分析或渗透测试感兴趣的话,我第一个要推荐给你的就是Python编程语言.Python不仅语法简单上手容易,而且它还有大量功能强大的库和程序可供我们使用.在这篇文章中,我们会给 ...

  5. 初学 Python(十一)——切片

    初学 Python(十一)--切片 初学 Python,主要整理一些学习到的知识点,这次是切片. #-*- coding:utf-8 -*- ''''' 切片 ''' L = ['name','age ...

  6. python笔记八(切片)

    一.切片 首先我们要记得在Python中可以用于切片的对象有 列表.元组.字符串. 切片操作就是直接从列表.元组或字符串中,选择出我们想要的内容,这些操作非常简洁实用. >>> L ...

  7. python工具 - 批量文件重命名

    日常工作中经常会遇到这样的情况,需要将某个文件夹下的文件按着一定的规则进行重命名,当文件数量及其庞大的时候手工一个一个的去修需要耗费大量的时间,以下python工具可以协助批量修改文件名. 场景:某文 ...

  8. 【Python】将python3.6软件的py文件打包成exe程序

    下载pyinstaller pyinstaller 改变图标 pyinstaller -F --icon=my.ico xxx.py 采用命令行操作的办法 在cmd命令行中,输入代码: 首先,前往Py ...

  9. 借助python工具从word文件中抽取相关表的定义,最后组装建表语句-非常好

    借助python工具从word文件中抽取表的定义,最后组装建表语句-非常好 --如有转载请以超链接的方式注明原文章出处,谢谢大家.请尊重每一位乐于分享的原创者 1.python脚本 ## -*- co ...

随机推荐

  1. wpf之二进制资源

    一.当需要添加图片.音频.视屏的资源到wpf项目里是,可以直接把文件添加到项目里 右击add->existing item. 1.如果想将外部文件编异常目标成为二进制资源,在文件的属性窗口 Bu ...

  2. 12 Mysql之工作中常用操作

    Mysql 专题讲解 一.用户创建与权限管理 a)  创建和删除用户 创建用户: CREATE USER jack@localhost; UPDATE USER SET password=passwo ...

  3. JS中数组与对象的遍历方法实例小结

    一.数组的遍历: 首先定义一个数组 1 arr=['snow','bran','king','nightking']; 1.for循环,需要知道数组的长度; 2.foreach,没有返回值,可以不知道 ...

  4. a标签 href不跳转 禁止跳转

    当页面中a标签不需要任何跳转时,从原理上来讲,可分如下两种方法: 标签属性href,使其指向空或不返回任何内容.如: <a href="javascript:void(0);" ...

  5. Matplotlib 随机漫步图

    import matplotlib.pyplot as plt from random import choice class Randomwalk(): def __init__(self,num_ ...

  6. C# Monitor Wait()和Pulse()

    C# Monitor Wait()和Pulse()   1.Monitor.Wait方法当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有 ...

  7. 如何解决Win10系统更新显示0x80080300代码的错误?

    Win10系统自推出以来就不断的在完善更新,其越来越丰富的功能也吸引了越来越多的用户.好系统Win10系统:https://www.vkebao.com/os/index_2.html但最近有用户反映 ...

  8. In Unix, what is tar, and how do I use it?

      In Unix, the name of the tar command is short for tape archiving, the storing of entire file syste ...

  9. 八,kubernetes集群存储卷基础。

    目录 存储卷 存储的分类 emptyDir 测试及使用 hostpath实例 Pod测试挂在共享NFS 写测试清单 测试 pv, pvc 创建几个PV 创建测试的Pod 和 PVC 存储卷 pod运行 ...

  10. java8学习之方法引用详解及默认方法分析

    方法引用: 之前花了很多时间对Lambda表达式进行了深入的学习,接下来开启新的主题---方法引用(Method References),其实在之前的学习中已经使用过了,如: 那方法引用跟Lambda ...