2016-07-23 291 views
2

我在交換圖像的通道(特別是紅色和藍色)時遇到了一些問題。我正在使用Opencv 3.0.0和Python 2.7.12。以下是我對換頻道如何在使用OpenCV的圖像中交換藍色和綠色通道

import cv2 

img = cv2.imread("input/car1.jpg") 

#The obvious approach 
Cimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 

#Manual Approach 
red = img[:,:,2] 
blue = img[:,:,0] 

img[:,:,0] = red 
img[:,:,2] = blue 

cv2.imshow("frame",Cimg) 
cv2.imshow("frame2", img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

我無法弄清楚,爲什麼相同的圖像通過相同的(可能)操作經歷是給兩個不同的輸出碼。有人能夠指出發生了什麼問題嗎?

謝謝!

原始圖像 The original Image

手動操作 The manual operation

COLOR_BGR2RGB The cv2.COLOR_BGR2RGB operation

回答

2

redblue只是意見你的形象。當你做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]]] 
+0

工作!謝謝 :) –

相關問題