2017-11-05 2 views
0

Ich versuche, einige Statiken von einigen Bildern zu bekommen, und wenn ich versuchte, Histogrammentzerrung durchzuführen, werde ich verwirrt.Histogrammausgleich skimage

Weil ich diese tryed:

img = io.imread(file); 
img = exposure.equalize_hist(img); 

Und ich bekomme die Warnung warn("This might be a color image. The histogram will be "

Dann tryed ich die Entzerrung in jedem Kanal wie folgt auszuführen:

img = io.imread(file); 
#img = exposure.equalize_hist(img);  
height, width = len(img), len(img[0]); 
r1 = []; 
g1 = []; 
b1 = []; 
for i in range(height): 
    for j in range(width): 
     pixel = img[i, j]; 
     r1.append(pixel[0]); 
     g1.append(pixel[1]); 
     b1.append(pixel[2]);  
r = exposure.equalize_hist(r1);   
g = exposure.equalize_hist(g1); 
b = exposure.equalize_hist(b1); 

Und ich bekomme die Fehler

AttributeError: 'list' object has no attribute 'shape' 

Also wie soll ich Histogrammentzerrung in einem Bild mit Farbe tun, und wenn ich es in einem Bild in HSV oder CIELAB tun möchte, ist es die gleiche Weise ?! histogram equalization

Antwort

1

jeden Kanal separat Zum Ausgleich:

from skimage import io, exposure 


img = io.imread(img_path) 

for channel in range(img.shape[2]): # equalizing each channel 
    img[:, :, channel] = exposure.equalize_hist(img[:, :, channel]) 

Das ist, weil img[:, :, channel] gibt Ihnen bereits den 2D-Bild-Array von equalize_hist unterstützt, so dass Sie nicht drei Listen erstellen müssen (die erheblich ineffizient sein können , Apropos). Der Code setzt voraus, dass Sie ein Bild (3D-Array) mit Kanälen auf der letzten Dimension haben (was der Fall ist, wenn Sie es mit laden).

Auch sollte es das gleiche mit RGB, HSV von Lab funktionieren (skimage Konvertierungen werden Kanäle auf der letzten Dimension halten). Zum Beispiel img = color.rgb2hsv(img) oder img = color.rgb2lab(img).

Wenn Sie ein Graustufenbild laden (bereits ein 2D-Array), sollte Ihre kommentierte Zeile funktionieren (Sie könnten beide Fälle mit einer einfachen if-Bedingung behandeln).

Nur etwas anderes: Sie können die Semikola fallen lassen.

+0

Ich glaube, ich habe aber jetzt habe ich seltsame Werte auf img, bevor sie auf img [0] Ich hatte [[179 138 172] [179 136 164] ..., [168 105 134] [173 112 143]] und jetzt habe ich alle Nullen: [[0 0 0] [0 0 0] [0 0 0] ..., [0 0 0] [0 0 0] [0 0 0]]. Ist es richtig? – Nathan

+1

Vielleicht wäre es am besten, in HSV zu konvertieren und auf dem V-Kanal zu arbeiten. Außerdem sind Neuskalierungsintensitäten oft besser zum Erhalten von Daten als eine Histogrammentzerrung. –

Verwandte Themen