該存儲庫包含用於創建給定圖像的馬賽克藝術版本的程式碼(和其他文件)。給定一個圖像(稱為原始圖像),主要思想是將原始圖像的(方形)補丁替換為給定圖像集中最相似的圖像(稱為圖塊圖像或簡稱圖塊) 。
此實作使用 Keras 的 KerasCV 子模組提供的穩定擴散模型來建立圖塊。它透過使用透過更改模型參數和不同文字提示創建的不同圖塊來創建相同圖像的馬賽克藝術,從而實現無限的創造力。
在下面的範例中,每行顯示一個(原始)圖像和兩個根據該圖像創建的馬賽克藝術圖像。最左邊的圖像是原始圖像,中間的圖像是使用 2,500 個瓷磚創建的馬賽克藝術,最右邊的圖像是使用 90,000 個瓷磚創建的馬賽克藝術。
該存儲庫中包含的主要文件和資料夾是:
images/tiles
資料夾中。images/canvases
資料夾中建立圖像的馬賽克藝術版本的程式碼以及用於建立平鋪圖像的程式碼。 主要依賴項是TensorFlow/Keras
(至少版本 2.9)、 Pillow
和Scipy
。如果您使用 Pip,則可以透過執行以下命令來安裝它們:
pip install -r requirements.txt
此外,程式碼是用 Python 3.9 編寫的,並在運行 Ubuntu 22.04 LTS 和 Keras 2.9(和 KerasCV 0.3.4)、NVIDIA RTX 3090 GPU 和 CUDA 11.6 的電腦上進行了測試。
打開使用 KerasCV+StableDiffusion 筆記本製作馬賽克藝術以查看程式碼。
此外,您可以修改主函數中的變數和參數(如下所示),以建立給定圖像的您自己的馬賽克藝術版本。如果您想建立圖像的馬賽克藝術版本,可以將圖像放置在images/canvases
資料夾中。
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" ))
運行main函數來執行程式碼。如果要重新製作圖塊圖像,請將remake_tiles
參數設定為True
。請注意,建立一組新的圖塊影像可能需要一段時間,因此建議在開始時將remake_tiles
設定為False
以使用目前的圖塊影像。
main ( remake_tiles = False )
該筆記本現已在 Kaggle 上提供。您可以使用此連結打開它。
- [ ] 使用不同的形狀來取代方塊(相同大小)。例如,梯形或三角形。
- [ ] 對原始影像的不同部分使用不同的平鋪影像。例如,使用一組包含人臉的圖像作為原始圖像中的人臉,使用一組包含風景的圖像作為原始圖像中的背景。
- [ ] 使用更好的相似性度量將圖塊與原始影像中的補丁進行比較。例如,使用 SSIM 度量代替歐幾里德距離。
此專案根據 Apache 2.0 授權條款獲得許可。有關更多詳細信息,請參閱許可證。請注意,圖像/畫布中的圖像檔案是從網路下載的,不屬於此儲存庫的創建者所有。因此,它們可能未獲得 Apache 2.0 許可證的許可。