Vic*_*san 6 python opencv numpy image
我正在使用 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)
Run Code Online (Sandbox Code Playgroud)
我一直得到错误的结果,有人可以帮忙吗???
您在计算 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)
Run Code Online (Sandbox Code Playgroud)
如果是图像尺寸的精确倍数,即 512x512,则作为当前偏移量,因此我们将获得 4 个相同大小的图块:
改变的偏移值,会得到你瓷砖不规则的大小,如果如果不是整数倍的图像尺寸,你以后可能会如果不通过改变所需要的过滤那些砖偏移math.ceil到math.floor的for循环。