含有无效区域的图像裁剪

图像中有一些区域是无效区域(值为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
相关推荐
王小义笔记27 分钟前
大模型微调步骤与精髓总结
python·大模型·llm
源码之家1 小时前
计算机毕业设计:Python汽车销量数据采集分析可视化系统 Flask框架 requests爬虫 可视化 车辆 大数据 机器学习 hadoop(建议收藏)✅
大数据·爬虫·python·django·flask·课程设计·美食
Roselind_Yi1 小时前
【吴恩达2026 Agentic AI】面试向+项目实战(含面试题+项目案例)-2
人工智能·python·机器学习·面试·职场和发展·langchain·agent
2401_827499991 小时前
python核心语法01-数据存储与运算
java·数据结构·python
一直会游泳的小猫1 小时前
ClaudeCode完整学习指南
python·ai编程·claude code·claude code指南
第一程序员1 小时前
Python与容器化:Docker和Kubernetes实战
python·github
JaydenAI1 小时前
[RAG在LangChain中的实现-04]常用的向量存储和基于向量存储的检索器
python·langchain·ai编程
Roselind_Yi1 小时前
【吴恩达2026 Agentic AI】面试向+项目实战(含面试题+项目案例)-1
人工智能·python·面试·职场和发展·langchain·gpt-3·agent
Alan GEO实施教练2 小时前
专利申请是否找代理机构:核心考量与决策逻辑拆解
大数据·人工智能·python
oyguyteggytrrwwwrt2 小时前
抄写YOLOE源码——先抄写ultralytics包,关于__init__.py
开发语言·python