我有一个黑白图像,每个像素值都加载为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
....
如何做到这一点?对于这样的工作,使用嵌套列表是一个好主意吗?如果没有,你会建议什么?
图像处理对我来说很新鲜。
非常感谢任何帮助,
答案 0 :(得分: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)
使用此boolean array for indexing,我们可以提取我们想要的值:
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)
PS。这个答案的灵感来自Ned Batchelder的回答here。
答案 1 :(得分: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)]