Warum ändert cv2.imwrite () die Farbe der Bilder?

8

Ich habe das folgende Stück Code:

%Vor%

Die Größe des Bildes ist 512 * 512, nach dem Speichern wird ein blaues Bild gelb. Es scheint, dass ein Kanal aufgegeben wird. Ich weiß wirklich nicht warum.

Hier ist der Wert von current_img:

    
StalkerMuse 23.02.2017, 03:16
quelle

1 Antwort

19

Ihr Problem besteht darin, dass skimage.io.imread lädt das Bild als RGB (oder RGBA), aber OpenCV geht davon aus, dass das Bild BGR oder BGRA (BGR ist das Standard-OpenCV-Farbformat). Dies bedeutet, dass blaue und rote Ebenen umgedreht werden.

3 Kanalbilder

Versuchen wir es mit dem folgenden einfachen Testbild:

Lassen Sie uns zuerst Ihren ursprünglichen Algorithmus ausprobieren:

%Vor%

Wir erhalten folgendes Ergebnis:

Wie Sie sehen können, sind rote und blaue Kanäle sichtbar vertauscht.

Der erste Ansatz, vorausgesetzt Sie möchten skimage weiterhin verwenden, um cv2 zu lesen, verwenden Sie cv2.cvtColor um von RGB in BGR zu konvertieren.

Da die neuen OpenCV-Dokumente die Python-Syntax nicht erwähnen, können Sie in diesem Fall auch die entsprechende Referenz für 2.4.x .

%Vor%

Jetzt erhalten wir die folgende Ausgabe:

Eine Alternative ist, einfach OpenCV zu verwenden - cv2.imread zu laden das Bild. In diesem Fall arbeiten wir nur mit BGR-Bildern.

Hinweis: Wenn keine Flags angegeben werden, bedeutet dies, dass cv2.IMREAD_COLOR standardmäßig verwendet wird - d. h. das Bild wird immer als 3-Kanal-Bild geladen (alle möglichen Alpha-Kanäle werden gelöscht).

%Vor%

4 Kanalbilder

Aus Ihrem Screenshot scheint es, dass Sie ein 4-Kanal-Bild haben. Dies würde RGBA in skimage und BGRA in OpenCV bedeuten. Die Prinzipien wären ähnlich.

  • Verwenden Sie entweder den Farbumwandlungscode cv2.COLOR_RGBA2BGRA
  • Oder verwenden Sie cv2.imread mit dem Flag cv2.IMREAD_UNCHANGED
Dan Mašek 23.02.2017, 04:00
quelle