2013-02-25 9 views
33

Ich habe ein Bild und ich möchte eine Region daraus extrahieren. Ich habe Koordinaten der linken oberen Ecke und der rechten unteren Ecke dieser Region. In Graustufen tue ich es so:Extrahieren einer Region aus einem Bild mit dem Schneiden in Python, OpenCV

I = cv2.imread("lena.png") 
I = cv2.cvtColor(I, cv2.COLOR_RGB2GRAY) 
region = I[248:280,245:288] 
tools.show_1_image_pylab(region) 

Ich kann es nicht herausfinden, wie man es in Farbe macht. Ich dachte daran, jeden Kanal R, G, B zu extrahieren; Schneiden Sie diese Region von jedem der Kanäle und verbinden Sie sie wieder zusammen, aber es gibt einen kürzeren Weg.

+0

Diese selbst sollte auch für die Farbbild arbeiten. –

+0

versuchen Sie es vor der Konvertierung Bild in Graustufen –

+0

auch, visualisieren Sie das Bild mit cv2.imshow() -Funktion. –

Antwort

84

Es gibt einen kleinen Unterschied in der Pixelreihenfolge in OpenCV und Matplotlib.

OpenCV folgt BGR-Reihenfolge, während Matplotlib wahrscheinlich RGB-Reihenfolge folgt.

Wenn Sie also ein in OpenCV geladenes Bild mit pylab-Funktionen anzeigen, müssen Sie es möglicherweise in den RGB-Modus konvertieren. (Ich bin mir nicht sicher, ob es eine einfache Methode gibt). Unten Verfahren zeigt es:

import cv2 
import numpy as np 
import matplotlib.pyplot as plt 

img = cv2.imread('messi4.jpg') 
b,g,r = cv2.split(img) 
img2 = cv2.merge([r,g,b]) 
plt.subplot(121);plt.imshow(img) # expects distorted color 
plt.subplot(122);plt.imshow(img2) # expect true color 
plt.show() 

cv2.imshow('bgr image',img) # expects true color 
cv2.imshow('rgb image',img2) # expects distorted color 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

NB: Bitte überprüfen @Amro ‚s Kommentar unten für eine bessere Methode der Umwandlung zwischen BGR und RGB. img2 = img[:,:,::-1]. Sehr einfach.

Führen Sie diesen Code aus und sehen Sie den Unterschied im Ergebnis selbst. Im Folgenden finden Sie, was ich habe:

Matplotlib Verwendung:

enter image description here

OpenCV verwenden:

enter image description here

+55

könnte man einfach tun: 'img2 = img [:,:, :: - 1]' um die Farbdimension von BGR auf RGB zu spiegeln (nur mit NumPy Indizierung) – Amro

+1

+1 - yeah, du hast Recht und es wäre schneller als meine Antwort. Danke für den Kommentar. (Ich wollte nur das Spiegeln von r- und b-Kanälen zeigen.) –

+3

Eine andere Möglichkeit, dieses Ergebnis zu erzielen, ist die Verwendung von 'cv2.cvtColor' mit dem Flag 'cv2.COLOR_BGR2RGB'. –

27

2 weitere Optionen noch nicht erwähnt:

img[..., ::-1] # same as the mentioned img[:, :, ::-1] but slightly shorter 

und die vielseitige

cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
Verwandte Themen