J'étudie avec un livre intitulé Digital Image Processing. J'ai implémenté (conversion de contraste) dans le but d'approfondir la compréhension.
Le contraste est le degré de changement de luminosité et de couleur. (Interprétation personnelle) Fort contraste → Facile à comprendre la luminosité et le transfert des couleurs, facile à comprendre le contour d'un objet. Contraste faible → Il est difficile de comprendre la luminosité et le transfert des couleurs, et il est difficile de comprendre le contour d'un objet.
En modifiant la relation entre l'entrée et la sortie, la tonalité de couleur de l'image peut être modifiée. Par conséquent, il devient facile à voir ou difficile à voir.
Utilisez un échantillon sombre comme celui de l'image ci-dessous pour faciliter la visualisation de l'effet.
python
#Bibliothèques requises
import cv2
import numpy as np
import matplotlib.pyplot as plt
#Chemin de la photo
pic_path = 'pet-bottle-pic/test/camera_pic/aquari3.jpg'
#Lis
pic_image = cv2.imread(pic_path)
#Convertir en gris
pic_image = cv2.cvtColor(pic_image, cv2.COLOR_BGR2GRAY)
#Lorsqu'il est lu avec cv, plt.cmap lors de l'utilisation d'imshow='gray'Notez qu'il ne sera pas gris sauf si vous spécifiez
plt.imshow(pic_image, cmap='gray')
plt.title('sample_dark')
plt.savefig("aquari_dark.jpg ")
python
#Pixel
pic_image.shape # (2464, 3280)
python
#Aplatir dans une dimension pour créer un histogramme
flat_data = np.ravel(pic_image)
#Portée de la barre
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_dark')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_dark.png ")
Selon la façon dont il est fait, le contraste dans n'importe quelle plage peut être augmenté. (Bien que ce soit un peu artificiel) Étant donné que l'image échantillon est dense dans la plage de valeurs de pixel de 0 à 50, l'angle est défini dans cette plage.
python
def bend_line(X):
y = X*5
y = np.where(y>=255, 255, y)
return y
python
X = np.arange(0, 255, 1)
y = bend_line(X)
plt.title('sample_dark_bend_line')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("bend_line.png ")
python
pic_func1 = bend_line(pic_image)
plt.imshow(pic_func1, cmap='gray')
plt.title('sample_dark_after_bend_line')
plt.savefig("aquari_dark_after_bend_line.jpg ")
python
flat_data = np.ravel(pic_func1)
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_dark_after_bend_line')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_dark_after_bend_line.png ")
Convient pour corriger des images trop sombres ou trop lumineuses pour être comprises. Convient pour augmenter le contraste des images avec une distribution près des bords.
Implémentez la formule suivante appelée fonction gamma.
python
def g_function(X, gamma):
y = 255*(X/255)**(1/gamma)
return y
python
X = np.arange(0, 255, 1)
gamma = [3, 2, 1.5, 1, 0.5, 0.33]
labels = ["3", "2", "1.5", "1", "0.5", "0.33"]
plt.title('g_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
for g, l in zip(gamma, labels):
y = g_function(X, g)
plt.plot(X, y, label = l)
plt.legend()
plt.savefig("g_function.png ")
γ est grand → Renforce le contraste des images sombres dans leur ensemble. γ est petit → Augmente globalement le contraste des images lumineuses.
python
gamma = 3
pic_gfunc = g_function(pic_image, gamma)
plt.imshow(pic_gfunc, cmap='gray')
plt.title('sample_dark_after_gfunc')
plt.savefig("aquari_dark_after_gfunc.jpg ")
python
flat_data = np.ravel(pic_gfunc)
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_dark_after_gfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_dark_after_gfunc.png ")
Caractéristiques: Normal
python
#Chemin de la photo
pic_path = 'pet-bottle-pic/test/camera_pic/aquari.jpg'
#Lis
pic_image = cv2.imread(pic_path)
#Convertir en gris
pic_image = cv2.cvtColor(pic_image, cv2.COLOR_BGR2GRAY)
#Lorsqu'il est lu avec cv, plt.cmap lors de l'utilisation d'imshow='gray'Notez qu'il ne sera pas gris sauf si vous spécifiez
plt.imshow(pic_image, cmap='gray')
plt.title('sample_normal')
plt.savefig("aquari.jpg ")
python
#Aplatir dans une dimension pour créer un histogramme
flat_data = np.ravel(pic_image)
#Portée de la barre
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_normal')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari.png ")
Convient pour augmenter le contraste des images avec une distribution proche du centre.
Mettre en œuvre la formule suivante
python
def s_func(X, a):
y = 255/(1 + np.exp(a*(-1*X + 127)))
return y
python
X = np.arange(0, 255, 1)
a = 0.05
y = s_func(X, a)
plt.title('s_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("s_function.png ")
python
a = 0.05
y = s_func(pic_image, a)
plt.imshow(y, cmap='gray')
plt.title('sample_after_sfunc')
plt.savefig("aquari_after_sfunc.jpg ")
python
flat_data = np.ravel(y)
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_sfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_sfunc.png ")
Il y a un aspect mystérieux dans son utilisation, mais je l'ai implémenté.
Lumineux → sombre Sombre → brillant devenir.
python
def rev_func(X):
y = -X + 255
return y
python
X = np.arange(0, 255, 1)
y = rev_func(X)
plt.title('Rev_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("rev_func.png ")
python
y = rev_func(pic_image)
plt.imshow(y, cmap='gray')
plt.title('sample_after_rev_func')
plt.savefig("aquari_after_rev_func.jpg ")
python
flat_data = np.ravel(y)
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_rev_func')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_rev_func.png ")
Cela ressemble à une affiche.
Intervalle: 64 Première étape: 64 Deuxième étape: 128 Troisième étape: 192 Quatrième étape: 255
python
def post_func(X):
y = np.where(X>=192, 255, X)
y = np.where((y >=128 ) & (y < 192), 170, y)
y = np.where((y >=64 ) & (y < 128), 85, y)
y = np.where(y<64, 0, y)
return y
python
X = np.arange(0, 255, 1)
y = post_func(X)
plt.title('post_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("post_func.png ")
python
y = post_func(pic_image)
plt.imshow(y, cmap='gray')
plt.title('sample_after_after_postfunc')
plt.savefig("aquari_after_postfunc.jpg ")
python
flat_data = np.ravel(y)
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_postfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_postfunc.png ")
Noir et blanc clair]
python
def to_func(X):
y = np.where(X>=127, 255, X)
y = np.where(y<127, 0, y)
return y
python
X = np.arange(0, 255, 1)
y = to_func(X)
plt.title('2_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("2_func.png ")
python
y = to_func(pic_image)
plt.imshow(y, cmap='gray')
plt.title('sample_after_after_tofunc')
plt.savefig("aquari_after_tofunc.jpg ")
python
flat_data = np.ravel(y)
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_totfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_tofunc.png ")
Cela ressemble à un film lors du développement d'une photo.
python
from math import pi
def sora_func(X):
X = (3*pi/255)*X
y = -127.5*(np.cos(X))+127.5
return y
python
X = np.arange(0, 255, 1)
y = sora_func(X)
plt.title('sora_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("sora_func.png ")
python
y = sora_func(pic_image)
plt.imshow(y, cmap='gray')
plt.title('sample_after_sorafunc')
plt.savefig("aquari_after_sorafunc.jpg ")
python
flat_data = np.ravel(y)
bins_range = range(0, 260, 5)
#Histogramme de sortie
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_soratfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_sorafunc.png ")
Fin
Recommended Posts