[PYTHON] Reproduzieren Sie thermografieähnliche Farbänderungen mit Sigmoid-Funktion

1. Thermografische Farbdarstellung

Wenn Sie die von einem Temperatursensor gemessene Temperatur an einen Server senden und visualisieren, möchten Sie manchmal die hohen und niedrigen Temperaturen in Farbe ausdrücken, wie in der Thermografie. Darüber hinaus ist der Ausdruck der Thermografie nicht auf die Temperatur beschränkt, sondern er ist wirksam, wenn die Größe der numerischen Werte durch Farbe ausgedrückt wird. Intuitiv reicht es aus, den in der Reihenfolge Blau → Grün → Rot angeordneten Farbtönen einen beliebigen Wert zuzuweisen und die Werte der drei Farben zu erhalten. Wenn ich versuche, es programmgesteuert auszudrücken, ist es etwas ärgerlich für das, was ich tun möchte. Unter der Annahme, dass der zu konvertierende Wertebereich im Bereich von 0,0 bis 1,0 liegt und jede RGB-Farbe im Bereich von 0 bis 255 liegt, nimmt der thermografieartige Farbausdruck die folgenden Farbänderungen vor.

Wert, den Sie konvertieren möchten R G B Farbe ausgedrückt in RGB
0.0 0 0 255 Blau
0.25 0 200 200 hellblau
0.5 0 255 0 Grün
0.75 200 200 0 Orange
1.0 255 0 0 rot

Als eine Methode zur Wiedergabe mit diesem Farbwechselprogramm scheint die Methode der Beschreibung durch feines Teilen der Bedingungen mit einer if-Anweisung häufig verwendet zu werden. Ich dachte jedoch, dass es möglich wäre, feinere Farbänderungen durch Annäherung an eine Funktion zu reproduzieren. Die folgenden Artikel wurden bereits veröffentlicht. In diesem Artikel werden die Teile, an denen sich die Farbe an verschiedenen Stellen ändert, durch die COS-Funktion angenähert. Aber auch in diesem Fall ist es notwendig, die Teile, die auf 0 kleben, und die Teile, die auf 1 kleben, zu trennen.

Wertgröße in thermografieartige Farbe umwandeln

  1. Ein Abschnitt, in dem sich der Wert kontinuierlich und reibungslos ändert 3.1 Abschnitt zu 1

Ich habe mich entschieden, die Sigmoid-Funktion als eine Funktion anzuwenden, die solche Änderungen vornimmt.

3. Sigmaid-Funktion

Die Sigmoidfunktion ist eine Funktion, die durch Modellierung der Eigenschaften der Nervenzellen eines Organismus erzeugt wird. Es wird in der Aktivierungsfunktion neuronaler Netze verwendet, da es sich nach einem bestimmten Wert schnell ändert.

Die Formel lautet wie folgt.

α wird zu einer Verstärkung, und durch Ändern dieses Wertes kann der Änderungsgradient geändert werden.

  sigmoid(x) = \frac{\tanh(αx/2)+1}{2}
    -1 <= x <= 1

Darüber hinaus ist die obige Formel in der folgenden Grafik dargestellt.

sigmoid.png

4. Anwenden der Sigmoid-Funktion auf das Farbrad

Die endgültige Form der Funktion, die Sie anstreben sollten, ist in der folgenden Grafik dargestellt. gradation.png

Die rote Farbe verwendet die Sigmoid-Funktion so wie sie ist. Blau verwendet die invertierte Funktion. Für Grün wird dies durch Hinzufügen der Funktionen Rot und Blau realisiert. Einzelheiten finden Sie im folgenden Code.

In Python sieht es folgendermaßen aus: Sie können die obige Grafik sehen, indem Sie sie auf Jupyter ausführen. Durch Ändern der Verstärkungs- und Offsetwerte können Sie den Grad der Überlappung der Wertverläufe ändern. Die Sigmoid-Methode implementiert den obigen Sigmoid-Funktionsausdruck so wie er ist. Die colorBarRGB-Methode erstellt für jede oben beschriebene Farbe eine Funktion. Das Ergebnis wird für jede Farbe in 0,0 bis 1,0 ausgegeben. Im Fall von 16 Bit ist das Ergebnis der Multiplikation jeder Farbe mit 1024 der tatsächliche Wert.


import numpy as np
from pandas import DataFrame as df
import matplotlib.pyplot as plt
%matplotlib inline

gain = 10
offset_x= 0.2
offset_green = 0.6

def sigmoid(x, gain=1, offset_x=0):
    return ((np.tanh(((x+offset_x)*gain)/2)+1)/2)

def colorBarRGB(x):
    x = (x * 2) - 1
    red = sigmoid(x, gain, -1*offset_x)
    blue = 1-sigmoid(x, gain, offset_x)
    green = sigmoid(x, gain, offset_green) + (1-sigmoid(x,gain,-1*offset_green))
    green = green - 1.0
    return (blue,green,red)

#Der Eingabewert ist 0.0〜1.Bereich von 0
data = [colorBarRGB(x*0.001) for x in range(0,1000)]

color = df(data)
color.plot()

Das Ergebnis der Umwandlung des obigen Ergebnisses in ein 8-Bit-Bild (0 bis 255) ist wie folgt. img2.jpg

Ich denke, dass die obige Methode den Ausdruck der Thermografie mit einem ziemlich kurzen Code realisieren kann. Durch Anpassen der Verstärkung und des Offsets scheint es auch einfach zu sein, Feineinstellungen vorzunehmen, indem der Grad der Überlappung von Abstufungen geändert wird.

Recommended Posts

Reproduzieren Sie thermografieähnliche Farbänderungen mit Sigmoid-Funktion
Versuchen Sie, Farbfilme mit Python zu reproduzieren
Schreiben Sie Ihre eigene Aktivierungsfunktion mit Pytorch (hartes Sigmoid)
Überlauf fehlerfreie Sigmoidfunktion