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中的包和模块实例
Nov 22 Python
Python导出数据到Excel可读取的CSV文件的方法
May 12 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
Python 类的特殊成员解析
Jun 20 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
python3.7简单的爬虫实例详解
Jul 08 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
Mar 02 Python
如何用Python 加密文件
Sep 10 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 Python
Python简易开发之制作计算器
Apr 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
zend framework重定向方法小结
2016/05/28 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
js实现导航跟随效果
2018/11/17 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
学习python需要有编程基础吗
2020/06/02 Python
Python打印不合法的文件名
2020/07/31 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
简单说说tomcat的配置
2013/05/28 面试题
市场营销专业推荐信
2013/11/03 职场文书
公务员总结性个人自我评价
2013/12/05 职场文书
区域销售经理岗位职责
2013/12/10 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
四年级下册教学反思
2014/02/01 职场文书
大学生求职自荐信范文
2015/03/04 职场文书
MongoDB支持的索引类型
2022/04/11 MongoDB