在Python中使用浮点数对ndarray进行切片

在Python中使用浮点数对ndarray进行切片,python,algorithm,numpy,image-processing,slice,Python,Algorithm,Numpy,Image Processing,Slice,我想用Python构造一个算法,将图像分割成n×n相等的块。我知道现有的Python包可以做到这一点,但我感兴趣的是使用结果块的维度执行数学计算,这些维度不需要是整数值 我已使用numpy和cv2成功地将图像输入转换为ndarray。我很好奇,我是否可以将ndarray对象切片,这样当我分割一个“像素”时,我只需将该“像素”对其各自块的贡献加权平均 例如,如果图像输入的尺寸为100px x 100px,我想将此图像分割为7x7个块,因为100/7=~14.2857,每个块的尺寸为14.2857

我想用Python构造一个算法,将图像分割成n×n相等的块。我知道现有的Python包可以做到这一点,但我感兴趣的是使用结果块的维度执行数学计算,这些维度不需要是整数值

我已使用
numpy
cv2
成功地将图像输入转换为
ndarray
。我很好奇,我是否可以将
ndarray
对象切片,这样当我分割一个“像素”时,我只需将该“像素”对其各自块的贡献加权平均

例如,如果图像输入的尺寸为100px x 100px,我想将此图像分割为7x7个块,因为100/7=~14.2857,每个块的尺寸为14.2857 x 14.2857。但是有一小部分像素是没有意义的。相反,我希望对其进行解释,以便第一个块包含来自像素(1,1)、(1,2)、(1,14)、(2,1)、(3,1)、(14,1)的所有信息,(14,14),满足(15,k)和(k,15)的所有像素的0.2857,以及像素(15,15)的0.2857*0.2857。我希望对所有49个街区都这样做


如有任何见解,将不胜感激!谢谢。

正如您正确观察到的,图像中不能有14.29像素。但是,您可以执行降采样到14(或更少)像素或升采样到15(或更多)像素。我认为前者是你想要的,但后者也是一个可行的选择

一种简单的方法是将图像大小调整为一个新的大小,该大小可以轻松拆分为7x7。如果使用正确的函数执行此操作(例如),它将自动插值像素值

为简单起见,假设您要将5x5图像分割为2x2块:

from scipy.ndimage.interpolation import zoom
import numpy as np

blocks = (2, 2)

image = np.arange(25).reshape(5, 5) * 10
print(image)
# [[  0  10  20  30  40]
#  [ 50  60  70  80  90]
#  [100 110 120 130 140]
#  [150 160 170 180 190]
#  [200 210 220 230 240]]

# use np.ceil instead of np.floor to do upsampling
zoom_factor = [np.floor(s / b) * b / s for s, b in zip(image.shape, blocks)]

zoomed = zoom(image, zoom_factor)
print(zoomed)
# [[  0  14  26  40]
#  [ 69  83  95 109]
#  [131 145 157 171]
#  [200 214 226 240]]

for b1 in range(0, zoomed.shape[0], blocks[0]):
    for b2 in range(0, zoomed.shape[1], blocks[1]):
        print('block:')
        print(zoomed[b1:b1+blocks[0], :][:, b2:b2+blocks[1]])
# block:
# [[ 0 14]
#  [69 83]]
# block:
# [[ 26  40]
#  [ 95 109]]
# block:
# [[131 145]
#  [200 214]]
# block:
# [[157 171]
#  [226 240]]

注意,在缩放图像中,第一行中的第二像素具有值14,其包含来自相邻像素10和20的贡献。(它可能也包含其他像素的贡献,因为zoom默认使用3阶样条曲线进行插值)。图像中间的其他像素包含来自周围环境的贡献。

谢谢输入。我喜欢这个建议。我使用这种方法遇到的唯一问题是比较两个不同维度的图像,这是我项目的总体目标。如果我有两个不同维度的图像,并且想要比较这两个呢?我是否应该缩小较大图像的尺寸以匹配较小图像的尺寸,然后实施此方法?谢谢你的帮助@威尔逊总的来说,是的,我会这么做。如果我处理许多不同尺寸的图像,我通常会选择一个“工作尺寸”,并将所有图像调整为该尺寸。较小的图像进行上采样,较大的图像进行下采样。如果你想放大较小的图片还是缩小较大的图片取决于你的应用和喜好。非常感谢你的回复。幸运的是,我正在处理非常大的图像,所以缩小这些图像以补偿各种分区大小并保持图像质量不会丢失太多像素信息。还有一个问题:如何在重新调整尺寸时保持图像的纵横比?@wilson要保持纵横比,请对每个尺寸使用相同的缩放因子。