图像处置惩罚:Tiler制作你的专属卡通头像和LOGO(圣诞特殊篇)

[复制链接]
查看921 | 回复0 | 2023-8-23 12:00:41 | 显示全部楼层 |阅读模式
0 媒介

   Tiler是一种使用各种其他较小图像平铺创建新图像的工具,它与其他马赛克工具差别,由于它可以顺应多种形状、大小、方向的贴图,称为buil in build。Tiler的英文意思是瓷砖,可以把它想象成用一个个自界说的瓷砖铺满图像的过程。通过使用Tiler最终可以达到像素风或文字云,适当用来制作本身的LOGO或头像
  体现图如下所示,正幸亏圣诞节前后,我调了一个圣诞风格的LOGO

这是用我的天下像素格做的蛋糕

这是贸易图标制作

1 安装与贴图

Tiler的安装非常简单
  1. git clone https://github.com/nuno-faria/tiler.git
  2. cd tiler
  3. pip install -r requirements.txt
复制代码
内置以下的贴图
贴图文件夹含义样例at@circles圆形clips回形针hearts心形lego乐高lines线条minecraft我的天下plus加号times乘号waves波浪线 2 算法原理

2.1 盘算像素频率

由于最终选择的贴图颜色要和原图相近,否则会很违和,以是在算法开始前要盘算图像的相对像素频率
  1. def mode_color(img, ignore_alpha=False):
  2.     counter = defaultdict(int)
  3.     total = 0
  4.     for y in img:
  5.         for x in y:
  6.             if len(x) < 4 or ignore_alpha or x[3] != 0:
  7.                 counter[tuple(x[:3])] += 1
  8.             else:
  9.                 counter[(-1,-1,-1)] += 1
  10.             total += 1
  11.     if total > 0:
  12.         mode_color = max(counter, key=counter.get)
  13.         if mode_color == (-1,-1,-1):
  14.             return None, None
  15.         else:
  16.             return mode_color, counter[mode_color] / total
  17.     else:
  18.         return None, None
复制代码
2.2 盘算像素相对间隔

常用的间隔度量方法是闵可夫斯基间隔
                                                    d                               i                               s                               t                                                 (                                           x                                  i                                          ,                                           x                                  j                                          )                                      =                                                   ∥                                               x                                     i                                              −                                               x                                     j                                              ∥                                          p                                      =                                                   (                                               ∑                                     u                                                                                     ∣                                                       x                                                           i                                              u                                                                     −                                                       x                                                           j                                              u                                                                     ∣                                                  p                                              )                                                      1                                  /                                  p                                                 ,                            p                            ⩾                            1                                  \mathrm{dist}\left( \boldsymbol{x}_i,\boldsymbol{x}_j \right) =\left\| \boldsymbol{x}_i-\boldsymbol{x}_j \right\| _p=\left( \sum\nolimits_u^{}{|x_{iu}-x_{ju}|}^p \right) ^{{{1}/{p}}}, p\geqslant 1                     dist(xi​,xj​)=∥xi​−xj​∥p​=(∑u​∣xiu​−xju​∣p)1/p,p⩾1
特殊地,当                                   p                         =                         1                              p=1                  p=1时为曼哈顿间隔;当                                   p                         =                         2                              p=2                  p=2时为欧氏间隔;当                                   p                         =                         ∞                              p=\infin                  p=∞时为切比雪夫间隔。这里的间隔度量就采取了欧式间隔,表征了像素差
  1. def color_distance(c1, c2):
  2.     c1_int = [int(x) for x in c1]
  3.     c2_int = [int(x) for x in c2]
  4.     return math.sqrt((c1_int[0] - c2_int[0])**2 + (c1_int[1] - c2_int[1])**2 + (c1_int[2] - c2_int[2])**2)
复制代码
2.3 盘算符合贴图

将像素频率和相对间隔匹配起来,可以得到在这个位置上最符合的贴图
  1. def most_similar_tile(box_mode_freq, tiles):
  2.     if not box_mode_freq[0]:
  3.         return (0, np.zeros(shape=tiles[0]['tile'].shape))
  4.     else:
  5.         min_distance = None
  6.         min_tile_img = None
  7.         for t in tiles:
  8.             dist = (1 + color_distance(box_mode_freq[0], t['mode'])) / box_mode_freq[1]
  9.             if min_distance is None or dist < min_distance:
  10.                 min_distance = dist
  11.                 min_tile_img = t['tile']
  12.         return (min_distance, min_tile_img)
复制代码
3 配置功能

Tiler提供了以下功能,在conf.py文件中:


  • DEPTH:颜色深度
    颜色深度也称为位分辨率(Bit Resolution),指在位图图像或视频视频缓冲区的一个像素中,每个颜色分量(Red、Green、Blue、Alpha通道(的比特数。所谓“位”指的是二进制位或是比特,位分辨率决定可以标志为多少种色彩品级的大概性,位分辨率越大可体现的色彩越丰富
  • ROTATIONS:旋转列表
    由于Tiler支持各种位姿的贴图,以是在这里界说大概的旋转角度,从这里可以看出Tiler比一般的马赛克风格工具自由度更大
  • COLOR_DEPTH:同DEPTH
  • RESIZING_SCALES:贴图的缩放列表,支持差别大小的贴图
  • PIXEL_SHIFT:为创建每个框而移动的像素数

  • OVERLAP_TILES :是否支持重叠
  • RENDER :是否创建渲染
  • POOL_SIZE :处置惩罚图像的进程数
  • OUT :输出路径
  • IMAGE_TO_TILE :输入路径
  • TILES_FOLDER:小图标路径
4 使用:以圣诞老人为例

我选择了这组参数
  1. DEPTH = 4
  2. ROTATIONS = [0]
  3. COLOR_DEPTH = 32
  4. RESIZING_SCALES = [0.1]
  5. PIXEL_SHIFT = (20, 1)
  6. OVERLAP_TILES = False
  7. RENDER = False
  8. POOL_SIZE = 8
  9. OUT = 'out.png'
  10. IMAGE_TO_TILE = "./images/santa-claus.png"
  11. TILES_FOLDER = "./tiles/lines/gen_line_h"
复制代码
接着终端运行
  1. python tiler.py
复制代码
即可生成如下的效果

更多玩法交给各人探索!
保举内容



  • 本手、能手、俗手?我用AI写2022高考全国作文题,会被看出来?
  • AI绘画忽然爆火?快速体验二次元画师NovelAI(diffusion)
  • AI写代码、修Bug,以致还想统治人类?快速体验ChatGPT
  • 吴恩达对话刘慈欣:让科幻更有勇气,让人工智能更有想象力

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则