【大图裁剪再拼接(适用于tif png等多种图片)】

大图裁剪再拼接(适用于tif png等多种图片)

import numpy as np
from PIL import Image
Image.MAX_IMAGE_PIXELS = 2500000000
import os
os.environ["OPENCV_IO_MAX_IMAGE_PIXELS"] = pow(2,40).__str__()
import cv2
import time


def cut_image(image):
    box_list = []
    # (left, upper, right, lower)
    for i in range(0,IMAGE_ROW + 1):#两重循环,生成图片基于原图的位置,i是高,j是宽
        for j in range(0,IMAGE_COLUMN + 1):
            # box = (j * item_width, i * item_width, (j + 1) * item_width, (i + 1) * item_width)
            if j == IMAGE_COLUMN and i == IMAGE_ROW:
                box = (i * item_height, height, j * item_width, width)
            elif j == IMAGE_COLUMN:
                box = (i * item_height,(i + 1) * item_height, j * item_width,  width)
            elif i == IMAGE_ROW:
                box = (i * item_height, height, j * item_width, (j + 1) * item_width)
            else:
                box = (i * item_height,(i + 1) * item_height, j * 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[box[0]:box[1], box[2]:box[3]] for box in box_list]
    return image_list

#保存
def save_images(image_list):
    index = 0
    for image in image_list:
        cv2.imwrite('./img/'+str(index).zfill(6) + '.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 100])
        # image.save('./img/'+str(index).zfill(6) + '.png', 'PNG')
        index += 1

#拼接
# 定义图像拼接函数
def image_compose():
    IMAGES_PATH = 'img/'  # 图片集地址
    IMAGES_FORMAT = ['.png']  # 图片格式
    IMAGE_SAVE_PATH = 'final.png'  # 图片转换后的地址

    # 获取图片集地址下的所有图片名称
    # image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
    #                os.path.splitext(name)[1] == item]
    # # print(image_names)
    # # 简单的对于参数的设定和实际图片集的大小进行数量判断
    # if len(image_names) != IMAGE_ROW * IMAGE_COLUMN:
    #     raise ValueError("合成图片的参数和要求的数量不能匹配!")

    to_image = Image.new('RGB', (width, height))  # 创建一个新图
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    for y in range(0, IMAGE_ROW + 1):
        for x in range(0, IMAGE_COLUMN + 1):
            name = str((IMAGE_COLUMN + 1) * y + x).zfill(6) + '.png'
            from_image = Image.open(IMAGES_PATH + name)
            to_image.paste(from_image, (x * item_width, y * item_height))
    return to_image.save(IMAGE_SAVE_PATH)  # 保存新图


if __name__ == '__main__':
    file_path = "result.tif"
    start = time.time()
    image = Image.open(file_path)
    end = time.time()
    print(end - start)
    width, height = image.size
    print(width, height)
    item_width = 1280
    IMAGE_ROW , IMAGE_COLUMN = height // item_width, width // item_width
    print(IMAGE_ROW , IMAGE_COLUMN)
    #image.show()
    start = time.time()
    image_list = cut_image(image)
    end = time.time()
    print(end - start)
    start = time.time()
    save_images(image_list)
    end = time.time()
    print(end - start)
    start = time.time()
    image_compose()  # 调用函数
    end = time.time()
    print(end - start)


猜你喜欢

转载自blog.csdn.net/poppyty/article/details/128879626