Maison  >  Article  >  développement back-end  >  Comment générer une peinture mosaïque en python ? Méthode pour générer des mosaïques (explication détaillée du code)

Comment générer une peinture mosaïque en python ? Méthode pour générer des mosaïques (explication détaillée du code)

青灯夜游
青灯夜游avant
2018-10-27 17:26:334427parcourir

Le contenu de cet article est de présenter comment générer des mosaïques en Python ? Méthode pour générer des mosaïques (explication détaillée du code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Une mosaïque est une grande image composée de petites images. Nos rendus, zoomez pour voir les détails. Chaque pièce est une image indépendante lorsqu'elle est assemblée pour former une grande image, cela ressemble à une peinture réalisée. de mosaïques, c'est ce qu'on appelle la peinture mosaïque. J'ai vu des mosaïques sur Internet et j'ai trouvé qu'elles étaient sympas, alors j'ai utilisé Python pour convertir une image originale en mosaïque.

Notre rendu est comme ceci :

Comment générer une peinture mosaïque en python ? Méthode pour générer des mosaïques (explication détaillée du code)

L'image originale est comme ceci :

Comment générer une peinture mosaïque en python ? Méthode pour générer des mosaïques (explication détaillée du code)

Le L'idée spécifique de mise en œuvre est la suivante :

Étape 1 : Collectez d'abord un ensemble d'images, qui seront utilisées comme petites images carrées dans la grande image. Plus il y a d’images, plus la couleur de l’image finale générée est proche.

Étape 2 : Divisez l'image à convertir en petites images carrées, comme suit

Comment générer une peinture mosaïque en python ? Méthode pour générer des mosaïques (explication détaillée du code)

Étape 3 : Pour chaque petite image de grille carrée, remplacez-la avec l'image la plus proche dans l'ensemble d'images. Une fois tous les petits carrés remplacés, notre mosaïque finale est générée.

Cela ne semble-t-il pas simple ?

Jetons un coup d'œil aux étapes spécifiques de mise en œuvre. Vous trouverez ci-dessous un peu de code de base.

Notre collection d'images est stockée dans le répertoire images. Le code suivant charge toutes les images du répertoire et les redimensionne à une taille unifiée

import re
import os
import cv2
import numpy as np
from tqdm import tqdm
IMG_DIR = "images"
def load_all_images(tile_row, tile_col):
 img_dir = IMG_DIR
 filenames = os.listdir(img_dir)
 result = []
 print(len(filenames))
 for filename in tqdm(filenames):
 if not re.search(".jpg", filename, re.I):
 continue
 try:
 filepath = os.path.join(img_dir, filename)
 im = cv2.imread(filepath)
 row = im.shape[0]
 col = im.shape[1]
 im = resize(im, tile_row, tile_col)
 result.append(np.array(im))
 except Exception as e:
 msg = "error with {} - {}".format(filepath, str(e))
 print(msg)
 return np.array(result, dtype=np.uint8)

Le paramètre de la fonction load_all_images ici est la taille unifiée, Tile_row et Tile_col correspondent respectivement à la hauteur et à la largeur.

Le code suivant divise l'image à convertir

img = cv2.imread(infile)
tile_row, tile_col = get_tile_row_col(img.shape)
for row in range(0, img_shape[0], tile_row):
 for col in range(0, img_shape[1], tile_col):
 roi = img[row:row+tile_row,col:col+tile_col,:]

On divise l'image à convertir en petits carrés Tile_row et Tile_col sont la hauteur et la largeur des petits carrés roi accès. données d’image en petits carrés.

Ce qui suit est une fonction pour calculer la similarité de deux images

from scipy.spatial.distance import euclidean
def img_distance(im1, im2):
 if im1.shape != im2.shape:
 msg = "shapes are different {} {}".format(im1.shape, im2.shape)
 raise Exception(msg)
 array1 = im1.flatten()
 array2 = im2.flatten()
 dist = euclidean(array1, array2)
 return dist

im1 et im2 sont les données de deux images Les données d'image sont un tableau numpy tridimensionnel. convertir le tableau tridimensionnel Après avoir formé un tableau unidimensionnel, comparez la distance euclidienne entre les deux. Pour trouver l'image la plus similaire, il vous suffit de parcourir toutes les images de l'ensemble d'images, de trouver l'image avec la distance la plus courte et de remplacer les petits carrés de l'image d'origine.

Jetons un coup d'œil à l'effet final :

Comment générer une peinture mosaïque en python ? Méthode pour générer des mosaïques (explication détaillée du code)

Les détails locaux dans l'image agrandie sont les suivants :

Comment générer une peinture mosaïque en python ? Méthode pour générer des mosaïques (explication détaillée du code)

Si vous n'êtes pas satisfait de la qualité de l'image et souhaitez une qualité d'image plus détaillée, vous pouvez envisager de diviser l'image en carrés plus petits lors de la segmentation, mais cela augmentera également la durée d'exécution du programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer

Articles Liés

Voir plus