Cet article présente principalement le traitement d'image par ** Tone Curve **. Le manuel a Tone Curve, mais pas de code ... C'est peut-être pour ceux qui se demandent quel type de code peut être réalisé.
Si vous ne connaissez pas Tone Curve et lisez cet article
Ce serait bien si vous pouviez facilement le découvrir par "Introduction" de [
Courbe de tonalité, image de sortie (couleur, échelle de gris), fonction de conversion Je vais les présenter dans l'ordre de.
Terminal: Windows 10
Console: cmd(invite de commande)
python:3.6.8
Environnement virtuel: venv
Il y a deux images d'entrée comme suit.
Couleur | Échelle de gris |
---|---|
J'ai utilisé cv2.cvtColor ()
d'OpenCV pour la mise à l'échelle des gris.
Comment les images en couleur et les images en échelle de gris changent Je vais le présenter.
Aussi, si la valeur de retour de la fonction est lue par la fonction cv2.imwrite ()
etc.
Vous pouvez le sauvegarder.
Inversez la valeur du pixel comme son nom l'indique. (* À partir de là, * x * dans la formule est la valeur du pixel.)
f(x) = 255 - x
input | output |
---|---|
--Échelle grise
input | output |
---|---|
Fonction de conversion
def negaPosi(frame):
return 255 - frame
Je serai couvert avec l '[article] précédemment introduit (https://qiita.com/RoaaaA/items/373f309f724c4b569749) ... Si vous voulez voir plus de détails, j'apprécierais que vous lisiez l'article.
Ici, la courbe de tonalité pour n = 2 est sortie. (* N est la valeur de combien de fois la valeur du pixel est multipliée.)
Une conversion qui augmente le contraste de l'image.
f(x) = \begin{cases} 2 \cdot x & (x < 128) \\ 255 & (otherwise)
\end{cases}
input | output |
---|---|
--Échelle grise
input | output |
---|---|
Fonction de conversion
def toneCurve1(frame, n = 1):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
if i < 256 / n:
look_up_table[i][0] = i * n
else:
look_up_table[i][0] = 255
return cv2.LUT(frame, look_up_table)
Il s'agit d'une conversion qui réduit le contraste par rapport au haut.
f(x) = \begin{cases} 0 & (x < 128) \\ 2 \cdot x - 255 & (otherwise)
\end{cases}
input | output |
---|---|
--Échelle grise
input | output |
---|---|
Fonction de conversion
def toneCurve2(frame, n = 1):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
if i < 256 - 256 / n :
look_up_table[i][0] = 0
else:
look_up_table[i][0] = i * n - 255 * (n - 1)
return cv2.LUT(frame, look_up_table)
Cette courbe de tonalité S est plus lumineuse dans les zones lumineuses Les zones sombres sont des transformations qui accentuent les zones sombres.
f(x) = \frac {255}{2} \cdot \left\{\sin\left(\frac {x}{255} - \frac {1}{2}\right)\pi + 1\right\}
input | output |
---|---|
--Échelle grise
input | output |
---|---|
L'image est claire quelque part.
Fonction de conversion
def sToneCurve(frame):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
look_up_table[i][0] = 255 * (np.sin(np.pi * (i/255 - 1/2)) + 1) / 2
return cv2.LUT(frame, look_up_table)
Dans la courbe de tonalité de type ligne brisée plus tôt Il y a une partie où les informations d'ombrage sont perdues après avoir été converties en une valeur constante (0, 255). Dans la conversion gamma, la conversion peut être effectuée tout en laissant les informations d'ombrage de cette pièce.
f(x) = 255 \cdot \left(\frac {x}{255}\right)^\frac{1}{\gamma}
Voici quelques modèles de valeurs γ.
input | γ = 3 | γ = 2 |
---|---|---|
γ = 1 | γ = 0.5 | γ = 1 / 3 |
--Échelle grise
input | γ = 3 | γ = 2 |
---|---|---|
γ = 1 | γ = 0.5 | γ = 1 / 3 |
De toute évidence, l'image de γ = 1 et l'entrée seront les mêmes.
Fonction de conversion
def gammaCurve(frame, gamma = 1):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
look_up_table[i][0] = pow(i / 255, 1 / gamma) * 255
return cv2.LUT(frame, look_up_table)
L'image ressemble à un mélange d'images négatives et positives.
La formule de conversion utilisée dans ma solarisation est la suivante.
f(x) = \frac {255}{2} \cdot \sin\left\{3\pi\left(\frac {x}{255} - \frac {1}{2}\right)\right\}
input | output |
---|---|
--Échelle grise
input | output |
---|---|
Fonction de conversion
def soralization(frame):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
look_up_table[i][0] = (np.sin(3 * np.pi * (i / 255 + 1 / 2 )) + 1) * 255 / 2
return cv2.LUT(frame, look_up_table)
La valeur du pixel est progressivement rendue constante. Ce sera une image semblable à une peinture.
En sortie, un motif dans lequel la valeur de pixel est divisée en 2, 3 et 4 étages est sorti.
input | step = 2 |
---|---|
step = 3 | step = 4 |
--Échelle grise
input | step = 2 |
---|---|
step = 3 | step = 4 |
Cela ressemble à une carte postale.
Fonction de conversion
def posterization(frame, step = 4):
if 1 < step and step <= 256:
look_up_table = np.zeros((256, 1), dtype = 'uint8')
split = int(256 / (step - 1))
up = int(256 / step)
for i in range(256):
if np.trunc(i / up) * split >= 255:
look_up_table[i][0] = 255
else:
look_up_table[i][0] = np.trunc(i / up) * split
return cv2.LUT(frame, look_up_table)
else:
return frame
Probablement la partie la plus difficile de l'élaboration de ce code ... Si vous avez un meilleur moyen, apprenez-moi s'il vous plaît.
À partir du seuil n
** Valeur lorsque petit est 0 (valeur minimale) **
** Une conversion qui change la valeur lorsqu'elle est grande à 255 (valeur maximale) **.
Je ne l'ai pas utilisé cette fois, mais dans la bibliothèque cv2 [Fonction de validation](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc /py_thresholding/py_thresholding.html). Il y a «cv2.adaptiveThreshold ()» et «cv2.threshold ()».
f(x) = \begin{cases}
0 & (x < n) \\ 255 &(otherwise)
\end{cases}
Cette fois, la sortie est pour le cas où le seuil n = {50, 128, 200}.
input | n = 50 |
---|---|
n = 128 | n = 200 |
--Échelle grise
input | n = 50 |
---|---|
n = 128 | n = 200 |
Fonction de conversion
def threshold(frame, threshold_v = 50):
frame[frame < threshold_v] = 0
frame[frame >= threshold_v] = 255
return frame
ex.py
import cv2
import numpy as np
#Les fonctions(réduction)
def main():
img_path = '.\\image\\castle.jpg' #Spécifier arbitrairement l'image
img = cv2.imread(img_path)
frame = grayScale(img)
#Fonction d'appel,Veuillez pratiquer.
#Exemple:
# cv2.imwrite('tone_changed.jpg', negaPosi(img))
if __name__ == '__main__':
main()
Cette fois, j'ai introduit la conversion de gradation par quelques courbes de tons. Ensuite, je pense faire du traitement d'image avec des filtres.
Vous pouvez ajouter une interface utilisateur pour la rendre plus pratique.
Puis: vague:
Recommended Posts