2016-07-23 6 views
2

Ich habe ein kleines Problem beim Austauschen der Kanäle (speziell rot und blau) eines Bildes. Ich benutze Opencv 3.0.0 und Python 2.7.12. mein Code ist folgende für das Vertauschen der KanäleWie man blauen und grünen Kanal in einem Bild mit OpenCV vertauscht

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() 

Ich bin nicht in der Lage, herauszufinden, warum das gleiche Bild durch das gleiche (wahrscheinlich) -Operation unterzogen wird, um zwei verschiedene Ausgänge geben. Kann jemand etwas Licht auf das werfen, was falsch läuft?

Danke!

Originalbild The original Image

Handbetrieb The manual operation

COLOR_BGR2RGB The cv2.COLOR_BGR2RGB operation

Antwort

2

red und blue sind nur Blick auf das Bild. Wenn Sie img[:,:,0] = red tun dies ändert img aber auch blue das ist nur eine Ansicht (im Grunde nur eine Referenz auf das Unterfeld img[:,:,0]) keine Kopie, so dass Sie die ursprünglichen blauen Kanalwerte verlieren. Grundsätzlich, was Sie annehmen, ist eine temporäre Kopie einfach nicht. Add .copy() und es wird funktionieren.

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) 

Ergebnisse:

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]]] 

Hinweis: Sie müssen eigentlich nur 1 Temp Kopie 1 Kanal. Oder Sie könnten auch einfach tun img[:,:,::-1] dies wieder eine Ansicht erstellen wird aber mit vertauschten Kanälen, img wird unverändert bleiben, es sei denn, Sie es neu zuweisen:

img = np.arange(27).reshape((3,3,3)) 

print(img[:,:,::-1]) 
print(img) 
img = img[:,:,::-1] 
print(img) 

Ergebnisse:

[[[ 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

Arbeiten! Vielen Dank :) –

Verwandte Themen