我正在使用 numpy 从 16 位 tiff 图像 (13777*16004) 创建 (224*224) 的图块。我能够沿着行和列裁剪/切片成 224*224 的相等图块。我在尝试创建新的图块时遇到了问题,移动图块大小的一半......例如:我想要实现的粗略算法
(1:224, 1:224)
(1:224、112:336)
(, 224:448)
目标是保留图块大小 (224*224),同时移动图块大小的一半以获得更多图像图块...
为执行任务而编写的代码片段
row_x = img.shape[0]
column_y = img.shape[1]
tile_size_x = 224
tile_size_y = 224
range_x = mpz(ceil(row_x/tile_size_x))
range_y = mpz(ceil(column_y/tile_size_y))
for x in range(range_x, row_x):
for y in range(range_y, column_y):
x0 = x * tile_size_x
x1 = int(x0/2) + tile_size_x
y0 = y * tile_size_y
y1 = int(y0/2) + tile_size_y
z = img[x0:x1, y0:y1]
print (z.shape,z.dtype)
我总是得到错误的结果,有人可以帮忙吗???
你在计算 for 循环的范围时有点偏离。要制作的切片数量必须使用两个切片之间的偏移量来计算,即x0/2
对于您的情况,我简化了您的代码并定义了一些有意义的变量,您可以配置这些变量以从给定图像获取所需的图块:
import cv2
import math
img = cv2.imread("/path/to/lena.png") # 512x512
img_shape = img.shape
tile_size = (256, 256)
offset = (256, 256)
for i in xrange(int(math.ceil(img_shape[0]/(offset[1] * 1.0)))):
for j in xrange(int(math.ceil(img_shape[1]/(offset[0] * 1.0)))):
cropped_img = img[offset[1]*i:min(offset[1]*i+tile_size[1], img_shape[0]), offset[0]*j:min(offset[0]*j+tile_size[0], img_shape[1])]
# Debugging the tiles
cv2.imwrite("debug_" + str(i) + "_" + str(j) + ".png", cropped_img)
由于当前偏移量是图像尺寸的精确倍数,即 512x512,因此我们将得到 4 个相同大小的图块:
更改偏移量的值,会得到不规则尺寸的图块,如果偏移量不是图像尺寸的精确倍数,如果不需要,您可以稍后通过更改来过滤这些图块math.ceil
to math.floor
in the for
loop.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)