Traitement d'image avec Python et OpenCV [Tone Curve]

introduction

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 [] tc.

Courbe de tonalité, image de sortie (couleur, échelle de gris), fonction de conversion Je vais les présenter dans l'ordre de.

Environnement d'exploitation

Terminal: Windows 10
Console: cmd(invite de commande)
python:3.6.8
Environnement virtuel: venv

table des matières

introduction

Il y a deux images d'entrée comme suit.

Couleur Échelle de gris
original.jpg grayScale.jpg

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.

▷ Inversion négative / positive

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

Courbe de ton

nega_posi.png

Image de sortie

input output
input output

--Échelle grise

input output
input output

une fonction

Fonction de conversion


def negaPosi(frame):
    return 255 - frame

▷ Courbe de ton linéaire pliée

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.)

◆ Courbe de tonalité de type ligne pliée 1

Une conversion qui augmente le contraste de l'image.

f(x) = \begin{cases} 2 \cdot x & (x < 128) \\ 255 & (otherwise)
  \end{cases}

Courbe de ton

tone_curve1.png

Image de sortie

input output
input output

--Échelle grise

input output
input output

une fonction

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)

◆ Courbe de tonalité de type ligne pliée 2

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}

Courbe de ton

tone_curve2.png

Image de sortie

input output
input output

--Échelle grise

input output
input output

une fonction

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)

▷ Courbe de ton en forme de S

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\}

Courbe de ton

s_tone_curve.png

Image de sortie

input output
input output

--Échelle grise

input output
input output

L'image est claire quelque part.

une fonction

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)

▷ Courbe de tonalité de conversion gamma

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}

Courbe de ton

Voici quelques modèles de valeurs γ.

gamma_curve.png

Image de sortie

input γ = 3 γ = 2
input output output
γ = 1 γ = 0.5 γ = 1 / 3
output output output

--Échelle grise

input γ = 3 γ = 2
input output output
γ = 1 γ = 0.5 γ = 1 / 3
output output output

De toute évidence, l'image de γ = 1 et l'entrée seront les mêmes.

une fonction

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)

▷ Solarisation

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\}

Courbe de ton

soralization.png

Image de sortie

input output
input output

--Échelle grise

input output
input output

une fonction

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)

▷ Postérisation

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.

Courbe de ton

posterization2.png posterization3.png
posterization.png posterization5.png

Image de sortie

input step = 2
input output
step = 3 step = 4
output output

--Échelle grise

input step = 2
input output
step = 3 step = 4
output output

Cela ressemble à une carte postale.

une fonction

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.

▷ Binarisation

À 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}

Courbe de ton

Cette fois, la sortie est pour le cas où le seuil n = {50, 128, 200}.

thre_50.png thre_128.png thre_200.png

Image de sortie

input n = 50
input output
n = 128 n = 200
output output

--Échelle grise

input n = 50
input output
n = 128 n = 200
output output

une fonction

Fonction de conversion


def threshold(frame, threshold_v = 50):
    frame[frame < threshold_v] = 0
    frame[frame >= threshold_v] = 255
    return frame

Fonction principale

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()

en conclusion

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:

référence

Article associé

Recommended Posts

Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image avec Python
Traitement d'image léger avec Python x OpenCV
"Traitement Apple" avec OpenCV3 + Python3
Édition d'image avec python OpenCV
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
[Python] Traitement d'image avec scicit-image
Principes de base du traitement d'image en temps réel avec opencv
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Traitement d'image avec la binarisation Python 100 knocks # 3
Trouver la similitude d'image avec Python + OpenCV
100 traitement d'image par Python Knock # 2 Échelle de gris
traitement d'image python
Bases du traitement d'images binarisées par Python
Traitement d'image par Python 100 knock # 10 filtre médian
100 traitement d'image avec Python Knock # 8 Max Pooling
Traitement d'image par Python 100 knock # 12 motion filter
Acquisition d'images depuis une caméra avec Python + OpenCV
Dessin avec Matrix-Reinventor of Python Image Processing-
Traitez facilement des images en Python avec Pillow
Traitement d'image avec Python 100 knocks # 7 pooling moyen
Traitement d'image avec Lambda + OpenCV (création d'image grise)
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
Traitement d'image avec MyHDL
Binarisation avec OpenCV / Python
Premier traitement d'image Python
Traitement d'image avec PIL
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé de "différencier" l'image avec Python + OpenCV
Traitement d'image à partir de zéro avec python (5) Transformation de Fourier
Traitement d'image à partir de zéro avec python (4) Extraction de contour
Traitement d'image avec la configuration de l'environnement Python pour Windows
J'ai essayé de "binariser" l'image avec Python + OpenCV
[Petite histoire] Tester la génération d'images avec Python / OpenCV
100 coups de traitement du langage avec Python 2015
Traitement d'image avec PIL (Pillow)
Remarques sur le traitement d'images HDR et RAW avec Python
Capture de caméra avec Python + OpenCV
Traitement du signal acoustique avec Python (2)
[Python] Utilisation d'OpenCV avec Python (basique)
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Traitement du signal acoustique avec Python
Tri des fichiers image avec Python (3)
Tweet avec image en Python
Tri des fichiers image avec Python
Détection de visage avec Python + OpenCV
Traitement d'image par python (Pillow)
[Python] Ajustement de courbe avec polypoly
Collection de traitement d'image en Python
Génération d'images JPEG en spécifiant la qualité avec Python + OpenCV
Créez diverses vidéos Photoshop avec Python + OpenCV ② Créez une image fixe Photoshop
Obtenez des fonctionnalités d'image avec OpenCV
Utiliser OpenCV avec Python @Mac
Reconnaissance d'image avec Keras + OpenCV
Coller le png avec le canal alpha comme une image transparente avec Python / OpenCV
[Jouons avec Python] Traitement d'image en monochrome et points
[Python] Lecture facile des fichiers image du numéro de série avec OpenCV
Briller la vie avec Python et OpenCV
Découpez une image avec python