red
和blue
只是意見你的形象。當你做img[:,:,0] = red
這個變化img
而且blue
這只是一個視圖(基本上只是一個參考子陣img[:,:,0]
)不是副本,所以你鬆了原來的藍色通道值。基本上你認爲是臨時副本不是。添加.copy()
,它會工作。
img = np.arange(27).reshape((3,3,3))
red = img[:,:,2].copy()
blue = img[:,:,0].copy()
img[:,:,0] = red
img[:,:,2] = blue
print("with copy:\n", img)
img = np.arange(27).reshape((3,3,3))
red = img[:,:,2]
blue = img[:,:,0]
img[:,:,0] = red
img[:,:,2] = blue
print("without copy:\n",img)
結果:
with copy:
[[[ 2 1 0]
[ 5 4 3]
[ 8 7 6]]
[[11 10 9]
[14 13 12]
[17 16 15]]
[[20 19 18]
[23 22 21]
[26 25 24]]]
without copy:
[[[ 2 1 2]
[ 5 4 5]
[ 8 7 8]]
[[11 10 11]
[14 13 14]
[17 16 17]]
[[20 19 20]
[23 22 23]
[26 25 26]]]
注意:你其實只需要1個通道的1個臨時副本。 或者你也可以簡單地做img[:,:,::-1]
這將再次創建一個視圖,但交換的通道,img
將保持不變,除非你將其重新分配:
img = np.arange(27).reshape((3,3,3))
print(img[:,:,::-1])
print(img)
img = img[:,:,::-1]
print(img)
結果:
[[[ 2 1 0]
[ 5 4 3]
[ 8 7 6]]
[[11 10 9]
[14 13 12]
[17 16 15]]
[[20 19 18]
[23 22 21]
[26 25 24]]]
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
[[[ 2 1 0]
[ 5 4 3]
[ 8 7 6]]
[[11 10 9]
[14 13 12]
[17 16 15]]
[[20 19 18]
[23 22 21]
[26 25 24]]]
工作!謝謝 :) –