使用 Python 和 Numpy 创建原始图像的图像图块 (m*n)

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)

我一直得到错误的结果,有人可以帮忙吗???

Zda*_*daR 6

您在计算 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.ceilmath.floorfor循环。