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.
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.
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))
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)])
Comme je l'ai écrit ci-dessus, obtenez la couleur de chaque pixel comme suit
img_pixels[100][200]
# => array([255,255,255])
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))
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. J'ai utilisé l'image de M. Pakutaso (https://www.pakutaso.com/), un site d'images gratuit.
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.
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.
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.
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.
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