我正在使用NumPy从我的16位TIFF图像(1377716004)创建(224x224)的平铺。我能够沿着行和列裁剪/切片成相等的224224平铺。我在尝试创建新的瓷砖时遇到了问题,将瓷砖大小移动了一半……例如:我试图实现的粗略算法
(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)
我总是得到错误的结果,有谁能帮忙吗?
6条答案
按热度按时间vktxenjb1#
在计算for循环的范围时,您出现了一些偏差。要制作的切片的数量必须使用两个切片之间的偏移量来计算,在您的例子中是
x0/2
,我已经简化了您的代码并定义了一些有意义的变量,您可以配置这些变量来从给定的图像中获得所需的切片:作为当前偏移量,如果图像尺寸的精确倍数为512x512,则我们将得到4个相同大小的瓷砖:
更改偏移量的值将得到不规则大小的瓷砖,如果偏移量不是图像尺寸的精确倍数,则可以稍后通过在
for
循环中将math.ceil
更改为math.floor
来过滤这些瓷砖。ttp71kqs2#
我认为您可以非常有效地使用
as_strided
。**编辑:**尽可能泛化跨步方法。
对于您的特定问题:
pokxtpni3#
我想你可以用这个
jc3wubiy4#
如果您不介意使用ImageMagick,那么使用-crop命令就很简单了。请参阅https://imagemagick.org/Usage/crop/#crop_tile
您可以使用Python子进程调用来调用Imagemagick。
输入:
为了简单起见,假设您想要4个256x256的瓷砖。
或按百分比
oyxsuwqo5#
我更喜欢事先计算瓷砖的数量,然后使用简单的重塑。例如
vlf7wbxs6#
由于我的声誉滞后,我不被允许在@Zdar的顶部答案下发表评论。然而,代码非常适合我的用例,我想对CV2中的Python3和颜色通道进行必要的更改。谢谢你,“兹达尔。”
这是他在读写图片时使用list(range())而不是xrange()和cv2.COLOR_BGR2RGB为Python3改编的代码。不知何故,CV2以相反的方式使用这些频道。