首页 > 解决方案 > 如何从 Python 中的大图像中提取重叠块?

问题描述

我有一张 9056 x 4476 像素的图像。由于我需要识别小物体并获取它们在大图像中的位置,因此我想从中提取重叠块以分别处理它们。这些块每个需要有 100 x 300 像素,因为我有一个使用 100 x 300 图像训练的机器学习。当我执行下面的代码时,我得到的图像具有 (100+2 * margin, 300+2 * margin) 像素。

此代码生成长度等于 1260 的数组列表。从位置 0 (out[0]) 到 30 (out[30]) 我得到了预期的结果。但是,从第31位到第89位,不是。在这些位置,“外形”是 (500, 0)。为什么会这样?

我从另一个 stackoverflow 帖子中得到了这段代码。我只是稍微修改了一下。

def splitted(img,window_size, margin):
sh = list(img.shape)
sh[0], sh[1] = sh[0] + margin * 2, sh[1] + margin * 2
img_ = np.zeros(shape=sh)
img_[margin:-margin, margin:-margin] = img

stride,step = [] , []
stride = window_size
step.append(window_size[0] + 2 * margin)
step.append(window_size[1] + 2 * margin)


nrows, ncols = img.shape[0] // window_size[0], img.shape[1] // window_size[1]
splitted = []
for i in range(nrows):
    for j in range(ncols):
        h_start = j*stride[0]
        v_start = i*stride[1]
        cropped = img_[v_start:v_start+step[0], h_start:h_start+step[1]]
        splitted.append(cropped)
return splittedenter

我称之为运行:

import cv2
import numpy as np

img = np.arange(9056 * 4476).reshape(9056,4476)
out = splitted(img, window_size=[300,100], margin=100)

如果有更简单的方法来获取这些块及其位置,我愿意接受建议。

标签: pythonimageimage-processing

解决方案


推荐阅读