代码先锋网 代码片段及技术文章聚合

将图片切patch并重新组合

技术标签: 深度学习  SR超分辨率  深度学习  pytorch  神经网络  python

当数据集的图片分辨率过大,而我们的显卡内存不足的时候,我们可以通过将一张图片切成多个patch进行训练或者预测,然后再将各个patch拼接回一张图片

1、图片切patch

import os.path
from PIL import Image
import sys
import torchvision.transforms as transforms

# 图片的切块
def cut_image(image, patch_num):
    width, height = image.size
    item_width = int(width / patch_num)
    item_height = int(height / patch_num)
    box_list = []
    # (left, upper, right, lower)
    for i in range(0 ,patch_num)  :  # 两重循环,生成n张图片基于原图的位置
        for j in range(0 ,patch_num):
            # print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
            box = ( j *item_width , i *item_height ,( j +1 ) *item_width ,( i +1 ) *item_height)
            box_list.append(box)
    print(box_list)
    image_list = [image.crop(box) for box in box_list]  #Image.crop(left, up, right, below)
    return image_list


# 保存
def save_images(image_list, save_path):
    index = 1
    for image in image_list:
        image.save(os.path.join(save_path, str(index) + '.png'))
        index += 1

if __name__ == '__main__':
    file_path = r'C:\Users\NAND\Desktop\\40\400.jpg'
    save_path = r'C:\Users\NAND\Desktop\\40\\patch/'
    image = Image.open(file_path)
    # image.show()
#     transform = transforms.Resize(224)
#     image = transform(image)
    image_list = cut_image(image, patch_num=3)#切成3*3=9张图片
    save_images(image_list,save_path)

2、patch拼接

# 图片的有间隙拼接
def image_compose(IMAGE_SIZE, IMAGE_ROW, IMAGE_COLUMN, padding, IMAGES_PATH, IMAGE_SAVE_PATH):
    IMAGES_FORMAT = ['.bmp', '.jpg', '.tif', '.png']  # 图片格式
    # 获取图片集地址下的所有图片名称
    image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
                   os.path.splitext(name)[1] == item]

    # 排序,这里需要根据自己的图片名称切割,得到数字
    image_names.sort(key=lambda x: int(x.split(("."), 2)[0]))

    # 简单的对于参数的设定和实际图片集的大小进行数量判断
    if len(image_names) != IMAGE_ROW * IMAGE_COLUMN:
      
        raise ValueError("合成图片的参数和要求的数量不能匹配!")

    to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE[0] + padding * (IMAGE_COLUMN-1), IMAGE_ROW * IMAGE_SIZE[1] + padding * (IMAGE_ROW-1)), 'white')  # 创建一个新图,颜色为白色
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    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[0], IMAGE_SIZE[1]), Image.ANTIALIAS)
            to_image.paste(from_image, (
            (x - 1) * IMAGE_SIZE[0] + padding * (x - 1),  (y - 1) * IMAGE_SIZE[1] + padding * (y - 1)))
    return to_image.save(IMAGE_SAVE_PATH)  # 保存新图


if __name__ == '__main__':
    padding=0#padding值为各个patch直接的间隙,设置为0的时候为无缝拼接
    IMAGE_SIZE = [885,664]  # 每张小图片的大小[item_width ,item_height]
    IMAGE_ROW = 3  # 图片间隔,也就是合并成一张图后,一共有几行
    IMAGE_COLUMN = 3  # 图片间隔,也就是合并成一张图后,一共有几列
    IMAGES_PATH = r'C:\Users\NAND\Desktop\40\llcnn\\'  # 图片集地址
    IMAGE_SAVE_PATH = r'C:\Users\NAND\Desktop\40\\40llcnn.png'  # 图片转换后的地址
    image_compose(IMAGE_SIZE, IMAGE_ROW, IMAGE_COLUMN, padding, IMAGES_PATH, IMAGE_SAVE_PATH) # 调用函数
版权声明:本文为weixin_49252254原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49252254/article/details/124218771

智能推荐

实现二:Map<Long, List<Long>> 存放的value 可能含有重复元素,将value 中含有重复元素的Map 重新组合

举例: Map<Long, List<Long>> map = new HashMap<>(16); List<Long> list1 = new ArrayList<>(); list1.add(1L); list1.add(2L); List<Long> list2 = new ArrayList<>(); l...

按照数组顺序给对象重新组合成新对象

需求:按照后台返回的数组的顺序,和返回的对象的键值合成新的对象,便于渲染到页面上 解决方法:(哈哈,就是二次遍历,但是遍历的顺序要注意,才接触,所以不懂得可以试试反过来遍历,看到问题就长记性了)  1、先遍历obj1,因为是按照obj1的顺序  2、obj1里遍历obj对象  3、判断obj的第i个键名是否和obj1[j]相等  4、在判断里组合自己想要的数...

按照左右半区的方式重新组合单链表

【题目】给定一个单链表的头部节点head,链表长度为N ,如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区;如果N为奇数,那么前N/2个节点算作左半区,后N/2+1个节点算作右半区。左半区从左到右依次记为L1->L2->…,右半区从左到右依次记为R1->R2->…,请将单链表调整成L1->R1->L2->R2...

猜你喜欢

190508打卡:按照左右半区的方式重新组合单链表

题目描述: 给定一个单链表的头部节点head,链表长度为N,如果N为偶数,那么前N/2个节点算zuobanqu左半区,后N/2算右半区;如果N为奇数,那么前N/2个节点算左半区,后N/2 + 1个节点算作右半区。左半区从左到右依次记为L1->L2->…,右半区从左到右依次记为R1->R2->…,请将单链表调整成L1->R1->L2-&...

算法总结之 按照左右半区的方式重新组合单链表

算法总结之 按照左右半区的方式重新组合单链表 把链表右边的 拿过来以此插入到左边的链表   思路:  如果链表长度为N,直接给出时间复杂度为O(N) 额外空间复杂度为O(1)的方法   1 如果链表为空,或者长度为1 不调整 2 链表长度大于1时, 遍历一便找到左半区最后一个节点 记为mid    posted @ 2017-09-11 20:05 toov5 阅读(...

算法总结之 按照左右半区的方式重新组合单链表

把链表右边的 拿过来以此插入到左边的链表   思路:  如果链表长度为N,直接给出时间复杂度为O(N) 额外空间复杂度为O(1)的方法   1 如果链表为空,或者长度为1 不调整 2 链表长度大于1时, 遍历一便找到左半区最后一个节点 记为mid   ...

按照左右半区的方式重新组合单链表

题目:   给定一个单链表的头节点head,链表长度为N,如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区;如果N为奇数,那么前N/2个节点算作左半区,后N/2+1个节点算作右半区。左半区从左到右依次是L1 -> L2 ->…,右半区从左到右依次是R1 -> R2 ->…,请将单链表调整成L1 -> R1 -> L...

Python—通过分隔符分割文件后按特定次序重新组合

把多个相同格式文本使用分隔符拆分后,将拆分的元素组合为两个或者多个文件...