2016-08-03 39 views
1

Ich habe ein RGB-Bild. Wenn ich dieses Bild importiere, wandle ich es unter Verwendung von matplotlib.color in HSV um und speichere das resultierende Array in einem dict. Wenn ich dieses Bild anzeigen möchte, verwende ich Image.fromarray mit mode = 'HSV'. Ich bin mir nicht sicher, was ich falsch mache, aber wenn das Bild angezeigt wird, bekomme ich ein Chaos (siehe unten mit Code). Jede Hilfe wird geschätzt. Die folgenden Codefragmente sind grob gesagt das, was bei einer bestimmten Menge importierter Bilder passiert.Python 3.5: PIL Image.fromarray produziert unsinniges Bild

RGB zu HSV-Code:

from skimage import io 
import matplotlib.colors as mpclr 
import glob 
import os 
from PIL import Image, ImageOps 

types = ("\*.tif", "\*.jpg", "\*.ppm") 
imagePath = [] 

def importAllImgs(folderPath): 

    for ext in types: 
     imagePath.extend(glob.glob(folderPath + ext)) 


    im_coll = io.ImageCollection(imagePath, conserve_memory = True) 
    im_array = []  

    for i in range(len(im_coll)): 
     #CONVERSION HAPPENS HERE 
     image = im_coll[i] 
     fltImg = np.around((np.array(image)/255.0), decimals = 2) 
     imgHSV = mpclr.rgb_to_hsv(fltImg) 

     im_array.append(imgHSV) 

    return im_array, imagePath 

Speicherung von Daten:

def organizeAllData(self, imgArrList, imgPathList): 

    self.allImages = dict()    
    self.imageKeys = imgPathList 

    for i in range(len(imgPathList)): 

     self.allImages[imgPathList[i]] = {'H': imgArrList[i][:, :, 0], 
              'S': imgArrList[i][:, :, 1], 
              'V': imgArrList[i][:, :, 2]} 


    self.hsvValues = [] 
    self.labelValues = [] 

    return self.allImages 

Bau von Array zum Anzeigen von Bild:

def getImage(self, imageOfInterest): 

    H = self.allImages[imageOfInterest]['H'][:,:] 
    S = self.allImages[imageOfInterest]['S'][:,:] 
    V = self.allImages[imageOfInterest]['V'][:,:] 

    imgArray = np.dstack((H,S,V)) 

    return imgArray 

von Bild angezeigt:

preImArray = halThrThsnd.getImage(self.imagePaths[self.imageIndex]) 
    self.preIm = Image.fromarray(preImArray, 'HSV') 

Und schließlich das resultierende Bild:

enter image description here

+1

Warum machen Sie nicht alle Bilder in scikit-image (wie Sie es bereits importieren)? Es ist viel spezialisierter, daher ist es weniger wahrscheinlich, dass Sie einen Fehler machen. Abhängig von Farbdimensionen und Farbformaten kann es mühsam sein, die richtigen Typen für alle diese Operationen zu behalten (z. B. interne Gleitkommazahlen oder vorzeichenlose Ganzzahlen). Es kann natürlich auch die Farbkonversion sowie die Ausgabe eines aktuellen Bildes durchführen. – sascha

Antwort

0

Wie pro Kommentar des Benutzers sascha (Frage unten sehen), habe ich beschlossen, die Bibliotheken zu normalisieren ich für HSV Umwandlung verwendet wird. Sobald ich das gemacht habe, habe ich normale Bilder kein Problem. Je nachdem, welche Bibliothek Sie für die Bildkonvertierung verwenden, erhalten Sie unterschiedliche HSV-Wertebereiche. Einige Bibliotheken erzeugen einen Bereich von 0 bis 1. Andere erzeugen einen Bereich von 0 bis 255.

Tl; dr: Benutzte die gleiche Bibliothek über alle Prozesse, bekam ein gutes Bild.