gpt4 book ai didi

python - 在 Python 中使用 float 切片 ndarray

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:27 25 4
gpt4 key购买 nike

我想用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com