将非常大的图像分割成重叠的框/块/图块/部分,python,OpenCV

问题描述 投票:0回答:2

我有 10k x 10k 的非常大的图像,我需要将其分割成重叠的框,如下所示。我希望盒子的大小为 X x Y,并且我需要在屏幕上跨过给定的距离(盒子在图像上移动的距离,以像素为单位)。然后将每个单独的盒子部分保存为其自己的图像文件。我希望能够更改 X 和 Y 值以及步幅值。我正在使用 Python 并拥有 OpenCV 谢谢你。

enter image description here

python image opencv split
2个回答
2
投票

这是一个函数,它将图像从各个侧面重叠分割。 在边界上它将用零填充。

它的本质是:它创建一个具有零填充的更大图像,然后提取大小为

window_size+2*margin
、步长为
window_size
的补丁。 (您可以根据自己的需要进行调整)

def split(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 = window_size
    step = window_size + 2 * margin

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

运行这个

img = np.arange(16).reshape(4,4)
out = split(img, window_size=2, margin=1)

会回来

[array([[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  1.,  2.],
        [ 0.,  4.,  5.,  6.],
        [ 0.,  8.,  9., 10.]]),
 array([[ 0.,  0.,  0.,  0.],
        [ 1.,  2.,  3.,  0.],
        [ 5.,  6.,  7.,  0.],
        [ 9., 10., 11.,  0.]]),
 array([[ 0.,  4.,  5.,  6.],
        [ 0.,  8.,  9., 10.],
        [ 0., 12., 13., 14.],
        [ 0.,  0.,  0.,  0.]]),
 array([[ 5.,  6.,  7.,  0.],
        [ 9., 10., 11.,  0.],
        [13., 14., 15.,  0.],
        [ 0.,  0.,  0.,  0.]])]

0
投票

Vadym B. 的答案不适用于 0 的边距,并且不包括步幅作为函数的输入。 这是一个修改后的分割函数,它将获取图像、窗口大小、边距和步幅,并使用设置的步幅创建具有边距的图像重叠图块。

def split(img, window_size, margin, stride):

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

  nrows, ncols = (img_.shape[0]- window_size) // stride + 1, (img_.shape[1]- window_size) // stride + 1
  splitted = []
  for i in range(nrows):
      for j in range(ncols):
          h_start = j*stride
          v_start = i*stride
          cropped = img_[v_start:v_start+window_size, h_start:h_start+window_size]
          splitted.append(cropped)
  return splitted
© www.soinside.com 2019 - 2024. All rights reserved.