含有无效区域的图像裁剪

图像中有一些区域是无效区域(值为0),希望将图像裁剪成多个小块且每个小块不包含无效区域

c 复制代码
def count_consecutive_ones(binary_string, k):
    # 将字符串转换为 NumPy 数组
    binary_array = np.array(list(binary_string), dtype=int)

    # 找到所有 1 的位置
    ones_positions = np.where(binary_array == 1)[0]

    if len(ones_positions) == 0:
        return [], []

    # 找到连续 1 的断点,差值大于1的地方
    split_indices = np.diff(ones_positions) > 1

    # 分割出每段连续 1 的位置数组
    segment_indices = np.split(ones_positions, np.where(split_indices)[0] + 1)

    # 计算每段连续 1 的长度
    segment_lengths = [len(segment) for segment in segment_indices if len(segment) > k]

    # 找出长度大于 k 的段的起始位置
    long_segment_pos = [(segment[0], segment[-1]) for segment in segment_indices if len(segment) > k]

    return segment_lengths, long_segment_pos


def split_image_into_patches_special(image, patch_size, stride):
    """
    将图像划分为多个 patch,且图像不包含0

    参数:
    - image: 输入图像
    - patch_size: 每个 patch 的大小,以元组 (height, width) 形式给出

    返回:
    - patches: 包含所有 patch 的列表
    """
    mask = image.sum(-1) > 0
    # left, right = np.where(mask.sum(0) > patch_size[0])[0], np.where(mask.sum(0) > patch_size[0])[-1]
    # top, bottom = np.where(mask.sum(1) > patch_size[1])[0], np.where(mask.sum(1) > patch_size[1])[-1]

    current_top = np.where(mask.sum(1) > patch_size)[0][0]
    patches = []
    while True:
        long_segment_pos = []
        for t in range(current_top, len(image) - stride + 1):
            segment_lengths, long_segment_pos = count_consecutive_ones(mask[t], k=stride)
            if len(segment_lengths) > 0:
                current_top = t
                break

        if len(long_segment_pos) == 0:
            break

        for current_start, current_end in long_segment_pos:
            for x in range(current_start, current_end-patch_size+1, stride):
                patch = image[current_top:current_top + patch_size, x:x + patch_size]
                mask[current_top:current_top + patch_size, x:x + patch_size] = 0
                patches.append(patch)


    return patches
相关推荐
郭庆汝4 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
思则变7 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络8 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find9 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取10 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector12 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习12 小时前
Python入门Day2
开发语言·python
Vertira12 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉12 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗12 小时前
黑马python(二十四)
开发语言·python