[PYTHON] Correction gamma sans utiliser OpenCV

introduction

La correction gamma est une méthode de conversion de la luminosité et du contraste lors du traitement d'image.

La formule est simple, si l'entrée est x et la sortie est y $ y = 255 ・ (\ frac {x} {255}) ^ \ frac {1} {\ gamma} $ Peut être représenté par. En changeant la valeur de ce $ \ gamma $, vous pouvez changer la valeur de pixel de l'image de sortie. Si $ \ gamma $ est supérieur à 1, il sera globalement plus clair, et si $ \ gamma $ est inférieur à 1, il sera globalement plus sombre. La figure ci-dessous montre la relation entre l'entrée et la sortie lorsque la valeur de $ \ gamma $ est modifiée. gamma.png

Dans certains cas, $ \ frac {1} {\ gamma} $ dans la formule est juste $ \ gamma $. Dans ce cas, le convexe en haut et le convexe en bas sont commutés.

La bibliothèque de traitement d'image OpenCV dispose également d'une fonction de correction gamma. Comme vous pouvez le voir dans la formule, c'est très simple, vous ne pouvez donc créer une fonction de correction gamma qu'avec numpy.

Essayez en fait

Créons une fonction de correction gamma basée sur la formule. Pour un moment.

#python version 3.6.5
import numpy as np               #version 1.14.3
import matplotlib.pyplot as plt 
from skimage import io           #scikit image version 0.13.1
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.size"] = 12

def gammma(x, r):
    """
Correction gamma y=255*(x/255) 
x Image d'entrée
r Coefficient de correction gamma
    """
    x = np.float64(x)
    y = x/255.
    y = y **(1/r)
    return np.uint8(255*y)

Créez également une fonction pour créer et afficher un histogramme pour chaque RVB. (Réapparition de quelles roues ... omis ci-dessous)

def hist_rgb(img):
    #Fonction pour créer un histogramme de RVB
    #Résolution variable qui stocke le résultat[brightness, channel]
    res = np.zeros([256, 3])   
    for channel in range(3):
        #Extraire une chaîne
        img_tmp = img[:,:,channel]
        #Rendre l'image unidimensionnelle
        img_tmp =img_tmp.reshape(img_tmp.size)
        for i in img_tmp:
            res[i, channel] += 1
    return res

def mat_hist_rgb(hist, ylim = 0.06):
    #hist_Afficher l'histogramme calculé par la fonction de RVB
    x = np.arange(hist.shape[0])
    #Spécifiez la couleur de l'histogramme
    colors = ["red", "green", "blue"]
    for i, color in enumerate(colors):
        plt.bar(x,hist[:, i], color=color, alpha=0.3, width=1.0)
    plt.xlabel("Brightness")
    plt.ylabel("Frequency")
    plt.xlim(0, 255)
    plt.yticks([])
    plt.show()

Tout d'abord, lisez lena et affichez l'histogramme de l'image d'origine.

img_lena = io.imread("lena_std.tif")
hist_lena = hist_rgb(img_lena)
mat_hist_rgb(hist_lena)

lena_std.jpg origin.png

Vous pouvez voir qu'il y a beaucoup de composant rouge.

Lorsque $ \ gamma = 0,5 $

img_gamma = gammma(img_lena, r=0.5)
io.imsave("r05.png ", img_gamma)
mat_hist_rgb(hist_rgb(img_gamma))

r05.png

Si vous regardez l'histogramme, vous pouvez voir qu'il est beaucoup plus sombre que l'image d'origine.

05hist.png

Lorsque $ \ gamma = 2,0 $

img_gamma = gammma(img_lena, r=2.0)
io.imsave("r05.png ", img_gamma)
mat_hist_rgb(hist_rgb(img_gamma))

Ce sera considérablement plus lumineux.

r20.png

20.png

Corriger uniquement des couleurs spécifiques

En regardant l'histogramme, vous pouvez voir que l'image de Lena est une image rougeâtre dans l'ensemble. Par conséquent, la correction gamma n'est appliquée qu'à une couleur spécifique, dans ce cas le canal rouge.

#Spécifiez RVB à convertir par canal, R=0, G=1, B=2
channel = 0

​#Copiez l'image d'origine
img_gamma = np.copy(img_lena)
​
#Correction gamma
img_gamma[:,:,channel] = gammma(img_lena[:,:,channel], r=0.3)
io.imsave("red.png ", img_gamma)
mat_hist_rgb(hist_rgb(img_gamma))

Puisque $ \ gamma = 0,3 $, la composante rouge est affaiblie. Cela semble plus naturel.

red.png

rr.png

Les références

Traitement d'images numériques [2e édition révisée], Association d'intérêt public Incorporated Foundation Image Information Education Promotion (2020)

Recommended Posts

Correction gamma sans utiliser OpenCV
Calcul de l'excédent sans utiliser le%
Écrivez FizzBuzz sans utiliser "="
Tri rapide sans utiliser le tri
Calcul de l'excédent sans utiliser le%
Tri à bulles sans utiliser le tri
Écrivez FizzBuzz sans utiliser "="
Tri rapide sans utiliser le tri
Correction gamma sans utiliser OpenCV
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Détection de caractéristiques à l'aide d'opencv (détection de coin)
[Python] Utilisation d'OpenCV avec Python (basique)
Essayez d'utiliser OpenCV sur Windows
Utiliser OpenCV avec Python @Mac
Créez une illusion rayée avec correction gamma pour Python3 et openCV3
Tour verticale de Pise utilisant OpenCV ~
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Jugement de l'image rétroéclairée avec OpenCV
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
[Python3] Google translate google translation sans utiliser l'API
[Python] Utilisation d'OpenCV avec Python (détection des bords)
J'ai essayé d'utiliser GrabCut d'OpenCV
Traitement de lignes horizontales à l'aide de la transformation de morphologie OpenCV