Graustufenumwandlung mit tf.reduce_mean & tf.concat

TensorFlow Neuling hier, Training auf einem einfachen Tutorial, die ich gerade scheitern Der Punkt ist, ein Bild in Graustufen umzuwandeln.

Unsere Daten sind grundsätzlich ein HxWx3 (Höhe des Bildes, Breite und Farbe auf drei Werten r, g, b).

So könnte es gleichbedeutend sein, jede Arrayzelle von [r, g, b] zu [gray, gray, gray] zu transformieren [gray, gray, gray] wobei gray = mean(r, g, b) richtig ist?

Also habe ich den doc auf eine mittlere Funktion überprüft und gefunden. Ich habe es auf der Farbachse verwendet, dh Achse = 2, dann das Ergebnis auf sich selbst mit der Achse 2 wieder auf "replizieren" Mittelwert und schließlich erhalten 3 mal den Grauwert (= Mittelwert) als rot, grün und blau.

Siehe den folgenden Code:

 import tensorflow as tf import matplotlib.image as mpimg filename = "MarshOrchid.jpg" raw_image_data = mpimg.imread(filename) image = tf.placeholder("uint8", [None, None, 3]) # Reduce axis 2 by mean (= color) # ie image = [[[r,g,b], ...]] # out = [[[ grayvalue ], ... ]] where grayvalue = mean(r, g, b) out = tf.reduce_mean(image, 2, keep_dims=True) # Associate r,g,b to the same mean value = concat mean on axis 2. # out = [[[ grayvalu, grayvalue, grayvalue], ...]] out = tf.concat(2, [out, out, out]) with tf.Session() as session: result = session.run(out, feed_dict={image: raw_image_data}) print(result.shape) plt.imshow(result) plt.show() 

(Sie können hier Originalbild bekommen)

Bildbeschreibung hier eingeben

Dieser Code kann ausgeführt werden, aber das Ergebnis ist nicht ok.

Wenn Graustufen fehlschlägt

Wundernd, was passiert ist, überprüfe ich meine Variablen, und es stellt sich heraus, dass der Mittelwert nicht ok ist, hat auf Screenshot unten gezeigt, bedeutet (147, 137, 88)! = 38

Bildbeschreibung hier eingeben

Irgendwelche Ideen? Kann nicht herausfinden, was ich falsch gemacht habe …

Vielen Dank! Pltrdy

One Solution collect form web for “Graustufenumwandlung mit tf.reduce_mean & tf.concat”

Ändern des dtype vor dem Rechenmittel (wegen Überlauf):

Der Fehler kommt aus dem dtype dein Platzhalter. Ursache der Typ-Inferenz, Zwischen-Tensoren können keine Werte größer als 255 (2 ^ 8-1) haben. Wenn Tensorflow berechnen Mittel (147, 137, 88), zuerst berechnet es: Summe (147, 137, 88) = 372, aber 372> 256 so halten sie 372% 256 = 116.

(147, 137, 88) = Summe (147, 137, 88) / 3 = 116/3 = 40. Ändern Sie den dtype Ihres Platzhalters auf "uint16" oder "uint32".

Ergebnis beim Umschalten auf uint16 (nicht wirklich überzeugend richtig):

Bildbeschreibung hier eingeben

Ändere dtype zurück zu uint8 vor dem Plotten, um pyplot spec:

(Siehe lib doc über imshow) Mentionen, dass es uint8 sein muss Aus irgendeinem Grund, mit uint16 funktioniert nicht (und es sieht aus wie es umgekehrt Farbe.Ich finde dunklen Bereich sind weiß in früheren Graustufen Transformation. Nicht sicher, warum).

Rückkehr zu uint_ mit tf.cast kurz vor dem Laufen (zB out = tf.cast(out, tf.uint8) ) gibt die gute Graustufen-Transformation unten:

Bildbeschreibung hier eingeben

  • So registrieren Sie einen benutzerdefinierten Farbverlauf für eine Operation, die aus tf-Operationen besteht
  • Effiziente Graduierung von Gradienten von TensorFlow?
  • Vorhersage mit InceptionV3 in Tensorflow
  • Tensorflow Verschiedene Möglichkeiten zum Exportieren und Ausführen von Graphen in C ++
  • TensorFlow Einsparung / Laden eines Graphen aus einer Datei
  • Zeitvergleich für TensorFlow Betrieb und Numpy Multiplikation
  • Replizieren von Modellen in Keras und Tensorflow für eine Multi-Thread-Einstellung
  • Q: TensorFlow 1.0.1 OpKernel unbekannt op Fehler
  • Kann nicht eine Matconvnet CNN Architektur in Keras replizieren
  • Tensorflow: Verwenden von Parameterservern im verteilten Training
  • Asynchrone Berechnung in TensorFlow
  • Python ist die beste Programmiersprache der Welt.