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 :
L'image originale est comme ceci :
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
É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 :
Les détails locaux dans l'image agrandie sont les suivants :
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!