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.
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.
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)
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))
Si vous regardez l'histogramme, vous pouvez voir qu'il est beaucoup plus sombre que l'image d'origine.
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.
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.
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