一、骰子作画
骰子作画是程序员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 版权协议,转载请附上原文出处链接和本声明。