Premier traitement d'image Python

introduction

Ravi de vous rencontrer, c'est le premier message de Qiita.

Je travaille généralement principalement sur Ruby, mais récemment, j'ai commencé à étudier le python comme passe-temps et j'ai trouvé qu'il était étonnamment facile de traiter des images, alors j'ai écrit sur le traitement d'image simple. J'ai écrit cet article et sa suite sur mon blog (http://www.uosansatox.biz/).

J'étudie toujours sur python, donc si vous n'écrivez pas ceci pour python, c'est lent ou le code est sale, veuillez me le faire savoir dans les commentaires.

En outre, le code ci-dessous utilise la bibliothèque python, numpy, oreiller. Dans l'environnement de l'auteur, Anaconda3 est utilisé sur windows10, il n'était donc pas nécessaire de l'installer séparément, mais veuillez l'installer si nécessaire lors de son exécution.

Vue d'ensemble du traitement d'image

Le traitement d'image est réalisé en changeant simplement la couleur de chaque pixel de bout en bout de l'image. Par conséquent, lisez d'abord le fichier image et convertissez-le en un tableau tridimensionnel dont la taille est la hauteur de l'image x la largeur de l'image x 3 pour une utilisation facile. En faisant cela, par exemple, la couleur du 100e pixel à partir de la gauche et du 200e pixel à partir du haut de l'image sera Il sera disponible sous la forme img_pixels [100] [200]. La valeur acquise sera un tableau [r, g, b] '' `` avec 3 éléments. Tout d'abord, je vais expliquer l'utilisation minimale de l'oreiller (PIL) et le traitement couramment utilisé dans le traitement d'image.

Charger l'image, créer un nouveau

Importez les bibliothèques requises au début de la ligne. Les images utilisées pour la clarté sont placées dans le même dossier que le fichier py.

edit_img.py


from PIL import Image
import numpy as np

#Chargement de l'image originale
img = Image.open('original.jpg')
#Obtenez la largeur et la hauteur de l'image d'origine
width, height = img.size
#Créer un objet Image de la même taille que l'image d'origine
img2 = Image.new('RGB', (width, height))

Disposition des fichiers image

Convertit l'image originale lue en un tableau.

img_pixels = []
for y in range(height):
  for x in range(width):
    # getpixel((x,y))Xème à partir de la gauche,Obtenez la couleur du yème pixel par le haut et img_Ajouter aux pixels
    img_pixels.append(img.getpixel((x,y)))
#Convertir en tableau numpy pour un calcul facile plus tard
img_pixels = np.array(img_pixels)

À propos, vous pouvez également écrire sur une ligne comme suit.

python


img_pixels = np.array([[img.getpixel((i,j)) for j in range(height)] for i in range(width)])

Obtenez la valeur de chaque pixel

Comme je l'ai écrit ci-dessus, obtenez la couleur de chaque pixel comme suit

img_pixels[100][200]
# => array([255,255,255])

Ensemble de valeurs en pixels

Pour définir la couleur sur le 100e pixel à partir de la gauche et le 200e pixel à partir du haut de l'objet image traité img2 comme suit Utilisez la méthode putpixel. Dans l'exemple ci-dessous, il est réglé sur bleu. Pour le définir sur rouge, définissez les trois derniers arguments sur 255,0,0.

img2.putpixel((100, 200), (0, 0, 255))

Afficher et enregistrer

Utilisez la méthode show pour afficher l'instance d'image modifiée.

img2.show()

Utilisez la méthode save pour enregistrer.

img2.save('edited_img.jpg')

Traitons en fait l'image en utilisant la méthode ci-dessus. Les images originales suivantes sont utilisées pour le traitement d'image. original.jpg J'ai utilisé l'image de M. Pakutaso (https://www.pakutaso.com/), un site d'images gratuit.

Traitement du flou

Implémente un flou qui donne à l'image entière un aspect un peu flou. L'inconvénient est que l'image devient plus petite par la taille du filtre. Créez une image qui semble floue en écrivant la couleur moyenne avec les couleurs environnantes sur l'image après le traitement. En fait, je voulais prendre la moyenne avec les couleurs en haut, en bas, à gauche et à droite vu du point de départ, mais par souci de simplicité, je prends la moyenne avec les couleurs en bas à droite.

bokashi.py


from PIL import Image
import numpy as np

img = Image.open('original.jpg')
width, height = img.size
filter_size = 20
img2 = Image.new('RGB', (width - filter_size, height - filter_size))
img_pixels = np.array([[img.getpixel((x,y)) for x in range(width)] for y in range(height)])

filter_size = 20

for y in range(height - filter_size):
  for x in range(width - filter_size):
    #position(x,y)Découpez une image avec une petite taille de filtre vertical et horizontal de l'image d'origine à partir de
    partial_img = img_pixels[y:y + filter_size, x:x + filter_size]
    #Alignez les valeurs de chaque pixel dans une petite image
    color_array = partial_img.reshape(filter_size ** 2, 3)
    #Chaque R,G,B Trouvez la moyenne de chacun et la position de l'image traitée(x,y)Défini sur la valeur de pixel de
    mean_r, mean_g, mean_b = color_array.mean(axis = 0)
    img2.putpixel((x,y), (int(mean_r), int(mean_g), int(mean_b)))

img2.show()
img2.save('bokashi.jpg')

Voici l'image de sortie. bokashi.jpg

mosaïque

Génère une image avec une mosaïque sur toute l'image. Crée une image (une seule couleur) avec la couleur la plus sombre et la même taille que l'image partielle parmi les images partielles pour les tailles de filtre vertical et horizontal. Créez une image mosaïque en adaptant l'une après l'autre l'image à une seule couleur créée à l'image traitée.

mozaiku.py


from PIL import Image
import numpy as np

img = Image.open('original.jpg')
width, height = img.size
filter_size = 10
img2 = Image.new('RGB', (width, height))
img_pixels = np.array([[img.getpixel((x,y)) for x in range(width)] for y in range(height)])

# 
def draw_partial_img(img2, start_x, start_y, partial_size_x, partial_size_y, pixel_color):
  for y in range(start_y, start_y + partial_size_y):
    for x in range(start_x, start_x + partial_size_x):
      img2.putpixel((x, y), pixel_color)

for y in range(0, height, filter_size):
  for x in range(0, width, filter_size):
    #Découpez une partie de l'image de la même manière que le flou
    partial_img = img_pixels[y:y + filter_size, x:x + filter_size]
    #Convertir en un tableau de couleurs
    color_array = partial_img.reshape(partial_img.shape[0] * partial_img.shape[1], 3)
    #R pour chaque pixel+ g +Obtenir le numéro de la chose b prend la valeur maximale
    #Le numéro de couleur le plus sombre de l'image découpée
    max_index = np.argmax(color_array.sum(axis=1))
    max_r, max_g, max_b = color_array[max_index]
    # (x,y)Couleur unique avec taille de filtre verticale et horizontale à partir de(Au-dessus des couleurs)Définir l'image de sur img2
    draw_partial_img(img2, x, y, partial_img.shape[1], partial_img.shape[0], (max_r, max_g, max_b))

img2.show()
img2.save('mozaiku.jpg')

Voici le résultat de la sortie. C'est désagréable car il y a une quadruple boucle, mais une image de cette taille s'est affichée en quelques secondes. mozaiku.jpg

Inversion de couleur

Produit une image inversée de couleur négative.

hanten.py


from PIL import Image
import numpy as np

img = Image.open('original.jpg')
width, height = img.size
img2 = Image.new('RGB', (width, height))
img_pixels = np.array([[img.getpixel((x,y)) for x in range(width)] for y in range(height)])

#Inverser les couleurs
reverse_color_pixels = 255 - img_pixels
for y in range(height):
  for x in range(width):
    #Créer une image avec des couleurs inversées
    r,g,b = reverse_color_pixels[y][x]
    img2.putpixel((x,y), (r,g,b))

img2.show()
img2.save('hanten.jpg')

Ci-dessous, l'image générée. C'est effrayant, probablement parce que l'image d'origine est belle, mais elle est belle même si elle est retournée. hanten.jpg

Résumé

En fait, il existe une méthode pour inverser la couleur en oreiller, mais cette fois, j'ai essayé d'implémenter le traitement d'image à l'aide de numpy pour la pratique de python.

C'était une phrase déraisonnable, mais merci d'avoir lu jusqu'au bout.

Il y a quelque chose que je veux faire un peu plus, alors je peux l'ajouter à nouveau.

Postscript

J'ai écrit une suite à cet article sur le site lié ci-dessous. Si vous souhaitez faire plus de choses, veuillez nous rendre visite. Traitement de réduction des couleurs par méthode moyenne k Génération de l'image peinte Créer une image de style miniature Masquage flou Validation et 3 seuils Accélérer la partie répétée Expansion et contraction

Recommended Posts

Premier traitement d'image Python
traitement d'image python
Traitement d'image avec Python
Traitement d'image avec Python (partie 2)
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
Traitement d'image par python (Pillow)
Collection de traitement d'image en Python
[Python] Traitement d'image avec scicit-image
Notes personnelles pour le traitement d'images python
Traitement d'image avec la binarisation Python 100 knocks # 3
100 traitement d'image par Python Knock # 2 Échelle de gris
[Traitement d'image] Postérisation
Premier Python
Premier Python 3 ~ Première comparaison ~
Traitement de fichiers Python
Premier Python
Premier Python ~ Codage 2 ~
Premier classificateur d'images
Premier python [O'REILLY]
Traitement d'image 100 coups ①
Traitement d'image par Python 100 knock # 10 filtre médian
Traitement d'image par le remplacement du canal Python 100 Knock # 1
100 traitement d'image avec Python Knock # 8 Max Pooling
Échelle de gris par matrice-Reinventor of Python image processing-
Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image par Python 100 knock # 12 motion filter
Traitement d'image par Python 100 Knock # 6 Traitement de réduction de couleur
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 léger avec Python x OpenCV
Filtrage par convolution par matrice-Reinventor of Python image processing-
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
Traitement d'image avec MyHDL
Python: traitement du langage naturel
Traitement de la communication par Python
Traitement multithread en python
PyQ ~ Première étape de Python ~
Lire le traitement d'image numérique
[Python] Premier SVM de Python / Scikit-learn
Traitement de texte avec Python
Format d'image en Python
Traitement des requêtes en Python
Traitement d'image à partir de zéro avec python (4) Extraction de contour
Traitement d'image? L'histoire du démarrage de Python pour
Traitement d'image avec la configuration de l'environnement Python pour Windows
Premier mémo divers sur Python
Traitement d'image par filtre de lissage Python 100 knock # 11 (filtre moyen)
[Python] Chapitre 01-01 À propos de Python (First Python)
Illustration de traitement de chaîne Python
Divers traitements de Python
Traitement d'image avec PIL
Traitement d'image par matrice Basics & Contents-Reinventor of Python image processing-
opencv-python Introduction au traitement d'image
python3 Mesurez la vitesse de traitement.
Traitement d'image avec PIL (Pillow)
"Traitement Apple" avec OpenCV3 + Python3
Édition d'image avec python OpenCV
Traitement du signal acoustique avec Python (2)