我正在使用 numpy 从我的 16 位 tiff 图像 (13777*16004) 创建 (224*224) 的图 block 。我能够沿着行和列裁剪/切片成 224*224 的相等图 block 。我在尝试创建移动一半瓷砖大小的新瓷砖时遇到了问题......例如:我想要实现的粗略算法
(1:224, 1:224)
(1:224, 112:336)
( , 224:448)
目标是保留图 block 大小 (224*224),同时移动一半图 block 大小以获得更多图像图 block ...
为执行任务编写的代码片段
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
,我已经简化了您的代码并定义了一些有意义的变量,您可以配置这些变量以获得来自给定图像的所需图 block :
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 个相同尺寸的图 block :
改变偏移量的值,会得到不规则大小的图 block ,如果偏移量不是图像尺寸的精确倍数,如果不需要,您可以稍后通过更改 math.ceil
来过滤这些图 block > 到 for
循环中的 math.floor
。
关于python - 使用 Python 和 Numpy 创建原始图像的图像 block (m*n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45950124/