python - 如何从 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)
如果有更简单的方法来获取这些块及其位置,我愿意接受建议。
解决方案
推荐阅读
- ios - RxSwift 文本 ControlProperty 对 UITextView 和 UITextField 有不同的行为
- java - 计时器的运行速度比代码中的值快吗?
- hadoop - hdfs dfs -ls 在具有多个名称节点的远程文件系统上?
- r - 重命名R中的多列
- clojure - 给定学年的 Clojure 回报
- css - 知道为什么我的最小和最大宽度媒体查询不起作用吗?
- javascript - 根据内容划分一行以分隔列,并且没有两次 *ngFor 迭代
- javascript - 在文本框中按下输入时如何触发javascript函数
- python-3.x - 使用熊猫仅向现有 csv 添加新行?
- java - “类型定义错误”处理响应时出错