2014-02-08 5 views
6

Ich möchte den Alpha-Kanal aus einem TIFF-Bild mit Python OpenCV lesen. Ich benutze Enthought Canopy mit OpenCV 2.4.5-3-Modul.Wie liest man den Alphakanal eines TIFF-Bildes in Python OpenCV?

Ich folgte dem Tutorial der OpenCV-Website mit cv2.imread, aber es scheint nicht zu funktionieren.

Was ich habe, ist jetzt:

import cv2 
image = cv2.imread('image.tif', -1) 

Dann habe ich: print (image.shape), es zeigt immer noch die (8192, 8192, 3). Aber ich habe Matlab benutzt, um das gleiche Bild zu lesen, ich kann die Dimension dieses Bildes sehen (8192, 8192, 4).

Ich bin mir nicht sicher, was ich tun soll, um den Alphakanal dieses Bildes zu lesen.

Vielen Dank im Voraus! Nan

+0

wenn folgende Antwort auf Nicht sicher [ "Alpha-Kanal in OpenCV"] (http://stackoverflow.com/q/1451021/2419207) ist immer noch relevant, aber es kann sein: http://stackoverflow.com/a/2111434/2419207 – iljau

+0

Danke, iljau! Wenn das gleiche Bild PNG-Datei ist, kann ich es mit cv2.imread lesen und ich kann sehen, dass es 4 Schichten gibt. Aber wenn das Format TIFF ist, das den Alpha-Kanal hat (Matlab kann es zeigen), zeigt es nur 3 Schichten an. Ich frage mich warum? –

+0

Nicht sicher, ob es verwandt ist, aber: ["OpenCV Problem: Alpha-Kanal-Unterstützung für 8-Bit-Tiffs (Patch # 2791)"] (http://code.opencv.org/issues/2791) – iljau

Antwort

1

Ich fand eine Lösung dieses Problem bei der Konvertierung des ursprünglichen Bildes in RBGA-Format durch PIL-Bibliothek.

from PIL import Image 
import numpy as np 
import cv2 

path_to_image = 'myimg.png' 
image = Image.open(path_to_image).convert('RGBA') 
image.save(path_to_image) 

image = cv2.imread(path_to_image, cv2.IMREAD_UNCHANGED) 
print image.shape 

out> (800, 689, 4)

+0

PIL ist was ich jetzt benutze. Aber ich habe darüber nachgedacht, ob OpenCV das RGBA-Bild direkt lesen kann. –

5

Dies ist eine alte Frage, aber nur für den Fall, dass jemand anderes stolpert darauf: wenn img.tiff ein 4-Kanal-TIFF ist, dann

ergibt (212,296,) wie erwartet.

Wenn Sie dann

channels = cv2.split(img) 

verwenden, können Sie die Alpha-Schicht Referenz (channels[3]) - zum Beispiel, als eine Maske.

Die Idee dazu wurde von How do I use Gimp/OpenCV Color to separate images into coloured RGB layers? genommen, die geschickt eine falsche Schicht und merge verwendet, um Wiederherstellung der einzelnen RGB-Schichten in ihren tatsächlichen Farben zu ermöglichen.

+0

Versuchte die Flagge, noch 3 Kanäle. Meine cv2-Version ist 2.4.9. Vielleicht hängt es von cv2 Buildflags ab? Das Tiff-Bild wurde mit Photoshop erstellt, indem der Kanal "Alpha" zur Registerkarte "Kanäle" hinzugefügt wurde.Keine Transparenz oder Schichten wurden verwendet, nur Hintergrundebene. Vielleicht ist es auch wichtig. – ogurets

+0

Speichert Photoshop das Bild als RGBA (d. H. Die Ebene namens "Alpha" wird speziell als tatsächliche Alpha-Ebene registriert)? Es wäre sinnvoll, wenn dies nicht der Fall wäre, da nicht jedes 4-Kanal-Bild RGBA ist. Ich bekomme oft Bilder, die 4 Ebenen haben (eine mit dem Namen "Alpha"), aber explizit in RGBA "konvertiert" werden muss. In https://gis.stackexchange.com/questions/229758/gdal-python-api-warp-and-translate-struggling-with-rgba hatte ich dieses Problem, und wollte einen 'Convert to RGBA' Schritt vermeiden ~ 60ms/Bild, aber es gibt ~ 3m Bilder ... so fügt es ** dumme ** Mengen an Zeit hinzu. –

+0

Ich habe diese Option nicht in CS4 (Image-> Modus hat nichts wie "RGBA"). Überprüfen Sie auch diesen Thread - https://forums.adobe.com/thread/1587246, diese Typen sind auch verwirrt. Ich musste die Dateien als Tiffs speichern und Xnview verwenden, um sie stapelweise in Png umzuwandeln (Alpha wird so zur Transparenz) und Png's in OpenCV zu verwenden. Außerdem gibt es bei OpenCV einfach nichts, sogar interne Vars enthalten nur 3 Kanäle und sonst nichts. – ogurets

0

löste ich das gleiche Problem mit:

pip install --upgrade opencv-python 
+1

Meinst du, dass du das selbe Problem hast und das OpenCV Upgraden es auflöst? – pratibha

+0

Ja, ich finde einige Kommentare sagen, dass "openCV 2.4" einige Bugs haben. Das kann sich verbessern. –