python实现简单骰子图像

  • Post author:
  • Post category:python




一、骰子作画



骰子作画是程序员Scott MacDonald做了一个很有趣的项目,他用一张黑底白点的骰子模拟出了一些人像照片。

在这里插入图片描述

任何一张图片都可以用骰子模拟出来,算法非常简单:将图片分成若干个区域,每个区域经过计算以后,用1-6之间的一个整数表示,代表骰子的一个面。这种将连续的量转化成不连续的整数的算法,属于vector quantization(矢量量化)的一个应用。



二、代码实现

# -*- coding: utf-8 -*-
from PIL import Image
import os
import numpy as np

#骰子图像存储路径
imgSrc = ['xxx\\touzi1s.bmp','xxx\\touzi2s.bmp','xxx\\touzi3s.bmp','xxx\touzi4s.bmp','xxx\\touzi5s.bmp','xxx\\touzi6s.bmp']

IMAGE_SAVE_PATH = "xxx\\output1.bmp"
list = np.ones((64,64))*0

def e(average):
    if 0 < average <= 42:
         return 0;
    elif 42 < average <= 85:
         return 1;
    elif 85 < average <= 127:
         return 2;
    elif 127 < average <= 169:
         return 3;
    elif 169 < average <= 211:
         return 4;
    elif 211 < average <= 255:
         return 5;

#定义拼接函数
def puzzle(list):
    to_image = Image.new('RGB', (64 * 16, 64 * 16)) #创建一个新图
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    for y in range(64):
        for x in range(64):
            age = list[y][x]
            src_num = e(age)
            from_image = Image.open(imgSrc[src_num])
            to_image.paste(from_image, ((x - 1) * 16, (y - 1) * 16))
    return to_image.save(IMAGE_SAVE_PATH) # 保存新图


if __name__ == '__main__':
 
    img = Image.open("xxxxxxxx\\lena1024.bmp") # 本地图片路径
    img = img.convert("RGB")
    img_array = img.load() # 加载图片
 
    x = 16  # 横面像素大小
    y = 16  # 纵面像素大小
    for j in range(int(img.height / y)):
        for k in range(int(img.width / x)):
            a = 0
            for l in range(x):
                for m in range(y):
                    a = (img_array[x * k + l, y * j + m][0] +
                         img_array[x * k + l, y * j + m][1] +
                         img_array[x * k + l, y * j + m][2]) / 3 + a
            a = a / (x * y)  # 计算单位面积内平均像素灰度
            list[j][k] = a
            
    puzzle(list)

同时我们也可以用字符来代替骰子面达到相同的效果,原理一样

# -*- coding: utf-8 -*-
from PIL import Image
 
if __name__ == '__main__':
 
    img = Image.open("C:\\Users\\hp\\Desktop\\数字图像处理\\骰子图像\\lena1024.bmp") # 本地图片路径
    img = img.convert("RGB")
    img_array = img.load() # 加载图片
 
    x = 5  # 横面像素大小
    y = 10  # 纵面像素大小
    for j in range(int(img.height / y)):
        for k in range(int(img.width / x)):
            a = 0
            for l in range(x):
                for m in range(y):
                    a = (img_array[x * k + l, y * j + m][0] +
                         img_array[x * k + l, y * j + m][1] +
                         img_array[x * k + l, y * j + m][2]) / 3 + a
            a = a / (x * y)  # 计算单位面积内平均像素灰度
            # 根据像素灰度输出字符,灰度越大,字符越简单(偏白色)
            if 0 < a <= 32:
                print("@", end="")
            elif 32 < a <= 64:
                print("#", end="")
            elif 64 < a <= 96:
                print("$", end="")
            elif 96 < a <= 128:
                print("*", end="")
            elif 128 < a <= 160:
                print("+", end="")
            elif 160 < a <= 192:
                print("^", end="")
            elif 192 < a <= 224:
                print("~", end="")
            elif 224 < a <= 255:
                print(".", end="")
        print("")
        

——————————————-分界线—————————————————小白进阶ing,

有问题欢迎大家指正!



版权声明:本文为qq_42250840原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。