python - 在 Python 中使用 float 切片 ndarray

标签 python algorithm numpy image-processing slice

我想用 Python 构建一个算法,将图像切成 n×n 相等的 block 。我知道现有的 Python 包可以执行此操作,但我对使用结果 block 的维度执行数学计算很感兴趣,这些维度不必是整数值。

我已经使用 numpycv2 成功地将我的图像输入转换为 ndarray。我很好奇我是否可以以某种方式对 ndarray 对象进行切片,这样当我拆分一个“像素”时,我就可以简单地取该“像素”对各自 block 的贡献的加权平均值。

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

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

最佳答案

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

一种简单的方法是将图像调整为可轻松拆分为 7x7 的新尺寸。如果您使用正确的函数来执行此操作(例如 scipy.ndimage.interpolation.zoom),它将自动插入像素值。

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

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 的贡献。(它可能也包含来自其他像素的贡献,因为默认情况下缩放使用 3 阶样条用于插值)。图像中间的其他像素包含来自整个周围邻域的贡献。

关于python - 在 Python 中使用 float 切片 ndarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43069426/

相关文章:

python - 从边界生成移动物体

python - 如果列表中的元素在另一个列表中,则删除该列表的元素

algorithm - 从多组任意项目中挑选项目时最大限度地减少重复项

python - Fortran double 转换为 Python float

python - 需要一个条件语句来填充基于字符串的列

python - 在 OSX 10.8 上为 Python 3.3 安装 numpy 时遇到问题

python - 旋转 python

c# - 查找链表的中间元素

algorithm - 数组去除重复元素

python - 检查 numpy 数组中的元素是否位于 2 列 numpy 数组的列之间