python实现将高分辨率图片切分为指定大小。

import cv2
import os
import numpy as np
from tqdm import tqdm

def is_mostly_black(image, threshold=0.30):
    """
    判断图像是否大部分区域都是黑色
    :param image: NumPy数组或PIL图像对象
    :param threshold: 阈值,大部分区域被认为是黑色的阈值
    :return: 如果大部分区域都是黑色返回True,否则返回False
    """

    # 如果输入是NumPy数组,检查其形状以确定通道数
    if image.shape[-1] == 3:
        # RGB彩色图像
        gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    elif len(image.shape) == 2:
        # 灰度图像
        gray_image = image
    else:
        raise ValueError("Unsupported image format")


    # 计算黑色像素的比例
    black_pixel_ratio = np.sum(gray_image < 50) / gray_image.size

    return black_pixel_ratio > threshold

def process_images_in_folder(input_folder, output_folder, size):
    """
    遍历输入文件夹中的所有图像文件并对它们进行处理。

    参数:
    input_folder (str): 输入文件夹的路径。
    output_folder (str): 输出文件夹的路径,用于保存处理后的图像。
    size (int): 切分小图的大小。

    返回:
    None
    """
    # 确保输出文件夹存在,如果不存在则创建它
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 获取输入文件夹中的所有文件
    image_files = [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f))]

    # 创建进度条
    progress_bar = tqdm(total=len(image_files), desc="Processing Images")

    for image_file in image_files:
        # 仅处理图像文件(可以根据需要扩展支持的文件类型)
        if image_file.endswith((".jpg", ".jpeg", ".png", ".bmp", ".tif")):
            image_path = os.path.join(input_folder, image_file)

            # 读取输入图像
            input_image = cv2.imread(image_path, cv2.IMREAD_UNCHANGED)

            # 获取输入图像的大小
            image_height, image_width = input_image.shape

            overlap = 0  # 重叠部分的大小,这里设置为四分之一的大小

            # 计算需要切分的小图的行数和列数
            rows = image_height // (size - overlap)
            cols = image_width // (size - overlap)

            # 循环切分图像
            for i in range(rows):
                for j in range(cols):
                    left = j * (size - overlap)
                    upper = i * (size - overlap)
                    right = left + size
                    lower = upper + size

                    # 切分小图
                    small_image = input_image[upper:lower, left:right]

                    # 检查图像是否大部分区域都是黑色
                    if not is_mostly_black(small_image):
                        # 生成唯一的输出文件名
                        filename, file_extension = os.path.splitext(image_file)
                        output_image_path = os.path.join(output_folder, f"{filename}_image_{i}_{j}.bmp")

                        # 保存小图
                        cv2.imwrite(output_image_path, small_image)

            # 更新进度条
            progress_bar.update(1)

    # 关闭进度条
    progress_bar.close()

if __name__ == "__main__":
    input_folder = ""  # 输入文件夹的路径
    output_folder = ""  # 输出文件夹的路径
    size = 640  # 切分小图的大小 (640x640)

    process_images_in_folder(input_folder, output_folder, size)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值