[PYTHON] Reproduisez le changement de couleur semblable à la thermographie avec la fonction sigmoïde

1. Représentation des couleurs par thermographie

Lors de l'envoi de la température mesurée par un capteur de température à un serveur et de sa visualisation, il y a des moments où l'on souhaite exprimer les températures hautes et basses en couleur, comme en thermographie. De plus, l'expression de la thermographie ne se limite pas à la température, mais elle est efficace pour exprimer l'ampleur des valeurs numériques par couleur. Intuitivement, il suffit d'attribuer une valeur arbitraire aux teintes disposées dans l'ordre bleu → vert → rouge et d'obtenir les valeurs de 3 couleurs. Quand j'essaie de l'exprimer par programme, c'est un peu ennuyeux pour ce que je veux faire. En supposant que la plage de valeurs à convertir est comprise entre 0,0 et 1,0 et que chaque couleur RVB est comprise entre 0 et 255, l'expression de couleur de type thermographie effectue les changements de couleur suivants.

Valeur que vous souhaitez convertir R G B Couleur exprimée en RVB
0.0 0 0 255 Bleu
0.25 0 200 200 bleu clair
0.5 0 255 0 vert
0.75 200 200 0 Orange
1.0 255 0 0 rouge

Comme méthode de reproduction avec ce programme de changement de couleur, il semble que la méthode de description en divisant finement les conditions avec une instruction if soit souvent utilisée. Cependant, je pensais qu'il serait possible de reproduire des changements de couleur plus fins en se rapprochant avec une fonction. Les articles suivants ont déjà été publiés. Dans cet article, les parties où la couleur change à divers endroits sont approximées par la fonction COS. Cependant, dans ce cas également, il est nécessaire de séparer les pièces collées à 0 et les pièces collées à 1.

Convertir la grandeur de la valeur en couleur de type thermographie

  1. Une section où la valeur change en continu et en douceur 3.1 Section jointe à 1

J'ai décidé d'appliquer la fonction sigmoïde en tant que fonction qui apporte de tels changements.

3. Fonction Sigmaid

La fonction sigmoïde est une fonction créée en modélisant les propriétés des cellules nerveuses d'un organisme. Il est utilisé dans la fonction d'activation des réseaux de neurones car il change rapidement après une certaine valeur.

La formule est la suivante.

α devient un gain, et en changeant cette valeur, le gradient de changement peut être changé.

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

De plus, la formule ci-dessus est indiquée dans le graphique ci-dessous.

sigmoid.png

4. Application de la fonction sigmoïde à la roue chromatique

La forme finale de la fonction que vous devez viser est celle illustrée dans le graphique ci-dessous. gradation.png

La couleur rouge utilise la fonction sigmoïde telle quelle. Le bleu utilise la fonction inversée. Pour le vert, il est réalisé en ajoutant les fonctions du rouge et du bleu. Voir le code ci-dessous pour plus de détails.

Lorsqu'il est implémenté en Python, cela ressemble à ceci: Vous pouvez voir le graphique ci-dessus en l'exécutant sur Jupyter. En modifiant les valeurs de gain et de décalage, vous pouvez modifier le degré de chevauchement de la gradation des valeurs. La méthode sigmoïde implémente l'expression de fonction sigmoïde ci-dessus telle quelle. La méthode colorBarRGB crée une fonction pour chaque couleur décrite ci-dessus. Le résultat est sorti de 0,0 à 1,0 pour chaque couleur, donc dans le cas de 16 bits, le résultat de la multiplication de chaque couleur par 1024 sera la valeur réelle.


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)

#La valeur d'entrée est 0.0〜1.Plage de 0
data = [colorBarRGB(x*0.001) for x in range(0,1000)]

color = df(data)
color.plot()

Le résultat de la conversion du résultat ci-dessus en une image 8 bits (0 à 255) est le suivant. img2.jpg

Je pense que la méthode ci-dessus permet de réaliser l'expression de la thermographie avec un code assez court. De plus, en ajustant le gain et le décalage, il semble qu'il soit facile de faire des réglages fins en modifiant le degré de chevauchement des gradations.

Recommended Posts

Reproduisez le changement de couleur semblable à la thermographie avec la fonction sigmoïde
Essayez de reproduire un film couleur avec Python
Écrivez votre propre fonction d'activation avec Pytorch (sigmoïde dur)
Fonction sigmoïde sans erreur de débordement