我有 10k x 10k 的非常大的图像,我需要将其分割成重叠的框,如下所示。我希望盒子的大小为 X x Y,并且我需要在屏幕上跨过给定的距离(盒子在图像上移动的距离,以像素为单位)。然后将每个单独的盒子部分保存为其自己的图像文件。我希望能够更改 X 和 Y 值以及步幅值。我正在使用 Python 并拥有 OpenCV 谢谢你。
这是一个函数,它将图像从各个侧面重叠分割。 在边界上它将用零填充。
它的本质是:它创建一个具有零填充的更大图像,然后提取大小为
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.]])]
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