图像中有一些区域是无效区域(值为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