python 生成马赛克图像 基础版

🎨 原理说明

第一步:收集图片集

首先收集一组图片,这些图片会作为大图中的小方格图片。图片越多,最后生成的图片颜色越接近。

第二步:分割原图

将要转换的图片分割成一个一个小方格图片。

第三步:替换小方格

对于每一个小方格图片,取图片集里面最接近的图片替换。所有小方格都替换后,就生成了我们最终的马赛克画。

💻 核心代码

加载图片集

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)

分割原图

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, :]

计算图片相似度

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

📝 说明

  • im1im2是两张图片的数据
  • 图片数据是一个三维的numpy数组
  • 将三维数组转换成一维数组后,比较两者的欧式距离
  • 找出最相似的图片,只需遍历图片集中所有的图片,找到距离最短的那张图片

作者:spike

分类: Python

创作时间:2026-02-24

更新时间:2026-02-24