Este repositorio incluye el código (y otros archivos) para crear versiones artísticas en mosaico de una imagen determinada. Dada una imagen (denominada imagen original), la idea principal es reemplazar los parches (de forma cuadrada) de la imagen original con la imagen más similar de un conjunto determinado de imágenes (denominada imágenes en mosaico o simplemente mosaicos). .
La implementación utiliza el modelo Stable Diffusion disponible en el submódulo KerasCV de Keras para crear los mosaicos. Permite una creatividad ilimitada al crear mosaicos de la misma imagen usando diferentes mosaicos creados cambiando los parámetros del modelo y usando diferentes indicaciones de texto.
En los ejemplos siguientes, cada fila muestra una imagen (original) y dos imágenes artísticas en mosaico creadas a partir de ella. La imagen de la izquierda es la imagen original, la imagen del medio es el mosaico creado con 2500 mosaicos y la imagen de la derecha es el mosaico creado con 90 000 mosaicos.
Los principales archivos y carpetas incluidos en este repositorio son:
images/tiles
.images/canvases
y también el código para crear las imágenes en mosaico. Las dependencias principales son TensorFlow/Keras
(al menos la versión 2.9), Pillow
y Scipy
. Si usa Pip, puede instalarlos ejecutando el siguiente comando:
pip install -r requirements.txt
Además, el código está escrito en Python 3.9 y se prueba en una computadora que ejecuta Ubuntu 22.04 LTS con Keras 2.9 (y KerasCV 0.3.4) en una GPU NVIDIA RTX 3090 con CUDA 11.6.
Abra Making Mosaic Art usando el cuaderno KerasCV+StableDiffusion para ver el código.
Además, puede modificar las variables y parámetros en la función principal (que se muestra a continuación) para crear sus propias versiones artísticas en mosaico de las imágenes dadas. Puede colocar sus imágenes en la carpeta images/canvases
si desea crear versiones artísticas en mosaico de ellas.
def main ( remake_tiles : bool ) -> None :
"""Main function to pack everything together and run it"""
# Extension to use for saving and loading the tile images
tile_file_extension = "jpeg"
# (Re)-make the tile images if the user wants to do so
if remake_tiles :
# Create a MosaicMaker object to make the tile images
image_maker = MosaicMaker ( img_width = 400 , img_height = 400 , jit_compile = False , seed = 33 )
# The text prompts to be used to make the tile images
prompt_seq = (( "A laughing woman" , ( "realistic" , "white background" )),
( "A sad girl" , ( "realistic" , "white background" )),
( "An old man" , ( "realistic" , "white background" )),
( "Face of a sad man" , ( "realistic" , "white background" )),
( "Drawing of rings of Saturn" , ( "abstract" , "white background" )),
( "A watercolor painting of a puppy" , ( "detailed" ,)),
( "Drawing of a red rose" , ( "elegant" , "detailed" , "white background" )),
( "View of a green forest with mountains in the background" , ( "elegant" , "lush" , "nature" )),
( "A painting of four oranges in a bowl" , ( "elegant" , "detailed" , "white background" )),
( "A ninja shuriken" , ( "realistic" , "metal" , "white background" )),)
# Make the tile images and save them
for index , prompt_data in enumerate ( prompt_seq ):
image_seq = image_maker . make_images ( prompt_data [ 0 ], prompt_data [ 1 ], num_images = 40 )
image_maker . save_images ( img_seq = image_seq , path = 'images/tiles' , prefix = f'p { index } ' ,
extension = tile_file_extension )
# Use the images in the images/canvases and images/tiles directories to make mosaic arts
for canvas_image_path in pathlib . Path ( "images/canvases" ). glob ( "*.png" ):
# Create a MosaicArtMaker object with about sqrt_num_tiles*sqrt_num_tiles tiles!
art_maker = MosaicArtMaker ( original_image_path = canvas_image_path , sqrt_num_tiles = 300 ,
tile_file_extension = tile_file_extension )
# Make the mosaic art and save it in the images/outputs directory
output_image = art_maker . make_mosaic_art ( k = 40 )
print ( f"Created a mosaic art version of ' { art_maker . original_image_path } ' using "
f" { art_maker . sqrt_num_tiles * art_maker . sqrt_num_tiles } smaller images created by a Stable Diffusion model" )
art_maker . save_images (( output_image ,), path = 'images/outputs' ,
prefix = f' { art_maker . original_image_name } _mosaic_art' )
# Display each original image and its mosaic art version
art_maker . display_images (( art_maker . original_image , output_image ),
( art_maker . original_image_name , art_maker . original_image_name + "_mosaic_art" ))
Ejecute la función principal para ejecutar el código. Si desea rehacer las imágenes de los mosaicos, establezca el parámetro remake_tiles
en True
. Tenga en cuenta que la creación de un nuevo conjunto de imágenes de mosaicos puede llevar algún tiempo, por lo que se recomienda utilizar las imágenes de mosaicos actuales al principio configurando remake_tiles
en False
.
main ( remake_tiles = False )
El cuaderno ya está disponible en Kaggle. Puedes abrirlo usando este enlace.
- [ ] Usar diferentes formas en lugar de cuadrados (del mismo tamaño) para los mosaicos. Por ejemplo, trapecios o triángulos.
- [] Usar diferentes imágenes de mosaico para diferentes partes de la imagen original. Por ejemplo, usar un conjunto de imágenes que contienen caras para las caras de la imagen original y usar un conjunto de imágenes que contienen paisajes para el fondo de la imagen original.
- [] Usar mejores métricas de similitud para comparar los mosaicos con un parche de la imagen original. Por ejemplo, utilizar la métrica SSIM en lugar de la distancia euclidiana.
Este proyecto está bajo los términos de la licencia Apache 2.0. Consulte LICENCIA para obtener más detalles. Tenga en cuenta que los archivos de imágenes en imágenes/lienzos se descargaron de la Web y no son propiedad del creador de este repositorio. En consecuencia, es posible que no tengan la licencia Apache 2.0.