在Python中以棋盘模式获取像素值

1 投票
2 回答
1917 浏览
提问于 2025-04-16 13:01

我有一张黑白图片,里面的每个像素值都是用numpy加载成一个嵌套列表的,大小是2948x1536。现在我需要按照棋盘格的方式提取这些像素。也就是说,我想要提取像这样排列的像素:

0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
....

我该怎么做呢?用嵌套列表来处理这个问题合适吗?如果不合适,你有什么建议?

图像处理对我来说还是个新领域。

任何帮助都会非常感谢,

2 个回答

0
imgdat = ... #your 2948x1536 nested list
checker1 = [r[i%2::2] for i,r in enumerate(imgdat)]
checker2 = [r[(i+1)%2::2] for i,r in enumerate(imgdat)]

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

2

我们来用更小的尺寸,这样结果更容易看:

import numpy as np
# w=2948
# h=1536
w=6
h=4
arr=np.arange(w*h).reshape(w,h)
print(arr)
print(arr.shape)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]
#  [16 17 18 19]
#  [20 21 22 23]]
# (6, 4)

我们可以构建一个棋盘格样式的布尔数组:

coords=np.ogrid[0:w,0:h]
idx=(coords[0]+coords[1])%2 == 1
print(idx)
print(idx.shape)
# [[False  True False  True]
#  [ True False  True False]
#  [False  True False  True]
#  [ True False  True False]
#  [False  True False  True]
#  [ True False  True False]]
# (6, 4)

使用这个 布尔数组进行索引,我们可以提取出我们想要的值:

checkerboard=arr[idx].reshape(w,h//2)
print(checkerboard)
print(checkerboard.shape)
# [[ 1  3]
#  [ 4  6]
#  [ 9 11]
#  [12 14]
#  [17 19]
#  [20 22]]
# (6, 2)

附注:这个答案的灵感来自Ned Batchelder在 这里的回答。

撰写回答