前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >拼图还能这么玩?

拼图还能这么玩?

作者头像
godweiyang
发布于 2022-06-09 02:24:53
发布于 2022-06-09 02:24:53
55000
代码可运行
举报
文章被收录于专栏:算法码上来算法码上来
运行总次数:0
代码可运行

作者 | godweiyang

出品 | 公众号:算法码上来(ID:GodNLP)

这两天将我所有微信好友的头像弄出来了,一共5000多张。然后想着可以用它们来做些啥,最后用它们拼图玩。

Mac微信的头像保存在:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/2.0b4.0.9/c1a30fcf75eedba12764b4d4170b977e/Avatar

其中倒数第二个那一长串字符串每个人会不同,根据自己情况进行修改。

用到的代码在文章最后,github上也开源了: https://github.com/godweiyang/FunnyMedia

最终效果

直接上最终效果图,首先是5000多张头像拼接成一张图片:

如果看不清的话可以放大看看细节:

然后是5000多张头像拼成的杨超越:

如果看不清的话可以放大看看细节:

杨超越的原图是这样的:

实现方法

实现方法很简单,拼接的话就是把头像依次粘贴在一块大画布上的不同区域,就跟贴瓷砖一样。

为了实现用不同头像拼接出杨超越,就需要先将杨超越图片进行分割,每一块小区域寻找一个颜色最相近的头像粘贴上去。我直接将图像区域的RBG值求了加权平均,然后在头像中寻找RGB均值相等的粘贴上去。

代码放到文章最后了,运行命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python3 image_stitch.py -d [图像合集目录] -i [待拼凑的图片] -s [小图最终的边长] -r

其中-d表示图像目录,你也可以放头像或者其他的图像;-i是你想拼成的大图路径,如果不设置的话就是直接把图像拼在一起;-s表示小图像最终的边长,实测设置为30效果最佳,图片大小和质量都比较好;-r表示是否随机排列图片。

此外之前还写过字符画视频的生成方法,代码也开源在同一个github上了: 我用字符画出了一个谷爱凌!

https://github.com/godweiyang/FunnyMedia

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import argparse
import os
import random
import math
from collections import defaultdict

import numpy as np
import PIL.Image as Image
from tqdm import tqdm, trange


def generate1(dir, size, rand):
    print(f"正在拼接尺寸:{size}...")
    nums = len(os.listdir(dir))
    nums_width = int(math.sqrt(nums))
    nums_height = int((nums + nums_width - 1) / nums_width)
    img_width = nums_width * size
    img_height = nums_height * size

    image = Image.new("RGB", (img_width, img_height), "white")
    x = 0
    y = 0

    files = os.listdir(dir)
    if rand:
        random.shuffle(files)

    for i in tqdm(files):
        try:
            img = Image.open(os.path.join(dir, i))
        except IOError:
            print(i)
            print("图像打开失败")
        else:
            img = img.resize((size, size), Image.ANTIALIAS)
            image.paste(img, (x * size, y * size))
            x += 1
            if x == nums_width:
                x = 0
                y += 1
            img.close()

    image.save(f"avatar_{size}.jpg")
    image.close()


def mean_pixel(colors):
    colors = [0.3 * r + 0.59 * g + 0.11 * b for r, g, b in colors]
    return int(np.mean(colors))


def generate2(dir, source, size, rand):
    print(f"正在拼接尺寸:{size}...")

    files = os.listdir(dir)
    if rand:
        random.shuffle(files)

    image = Image.open(source)
    image = image.convert("RGB")
    img_width, img_height = image.size
    img_width = ((img_width + size - 1) // size) * size * ((size + 9) // 10)
    img_height = ((img_height + size - 1) // size) * size * ((size + 9) // 10)
    image = image.resize((img_width, img_height), Image.ANTIALIAS)

    colors = defaultdict(list)
    for i in tqdm(files):
        try:
            img = Image.open(os.path.join(dir, i))
        except IOError:
            print(i)
            print("图像打开失败")
        else:
            img = img.convert("RGB")
            img = img.resize((size, size), Image.ANTIALIAS)
            colors[mean_pixel(img.getdata())].append(i)
            img.close()
    for i in range(256):
        if len(colors[i]) == 0:
            for n in range(1, 256):
                if len(colors[i - n]) != 0:
                    colors[i] = colors[i - n]
                    break
                if len(colors[i + n]) != 0:
                    colors[i] = colors[i + n]
                    break

    index = defaultdict(int)
    for i in trange(0, img_width, size):
        for j in range(0, img_height, size):
            now_colors = []
            for ii in range(i, i + size):
                for jj in range(j, j + size):
                    now_colors.append(image.getpixel((ii, jj)))
            mean_color = mean_pixel(now_colors)
            img = Image.open(
                os.path.join(
                    dir, colors[mean_color][index[mean_color] % len(colors[mean_color])]
                )
            )
            img = img.convert("RGB")
            img = img.resize((size, size), Image.ANTIALIAS)
            image.paste(img, (i, j))
            img.close()
            index[mean_color] += 1

    source_name = ".".join(source.split(".")[:-1])
    image.save(f"{source_name}_{size}.jpg")
    image.close()


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--dir", "-d", type=str, default="avatar", help="directory of the avatars"
    )
    parser.add_argument(
        "--img", "-i", type=str, default="", help="source image to be coverd"
    )
    parser.add_argument(
        "--size",
        "-s",
        type=str,
        default="30",
        help="size of each avatar (size1,size2,...)",
    )
    parser.add_argument(
        "--rand",
        "-r",
        action="store_true",
        help="whether to shuffle the avatars",
    )
    args = parser.parse_args()
    sizes = [int(s) for s in args.size.split(",")]
    for size in sizes:
        if len(args.img) == 0:
            generate1(args.dir, size, args.rand)
        else:
            generate2(args.dir, args.img, size, args.rand)

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法码上来 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
教你用Python制作微信好友背景墙
前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像。
double
2019/07/31
1.1K0
教你用Python制作微信好友背景墙
coco2017数据集转换为yolo格式(记录过程)
使用命令git clone https://github.com/ssaru/convert2Yolo.git克隆到本地
用户11001451
2024/02/28
1.1K0
还在为520礼物发愁吗?教你用python撩女朋友
用python撩女朋友,你要的温暖都在生活的细节中。学会制造惊喜,一起牵手走向更加美好的生活。
不吃西红柿
2022/07/29
1840
还在为520礼物发愁吗?教你用python撩女朋友
【实战教程】用CodeBuddy打造多风格图片合成神器
在上一章节中我们已经实现了图片下载的脚本了, 本篇文章我们主要实现的是将多张图片合并成一张图片,并可以选择生成不同风格的图片。通过本教程,你将学会如何利用AI助手快速实现图片合成功能,打造属于自己的图片处理工具。
全栈若城
2025/05/19
1450
[Python还能干嘛]微信好友头像完成马赛克拼图~
何谓马赛克拼图,简单来说就是将若干小图片平凑成为一张大图,如下图路飞一样,如果放大看你会发现里面都是一些海贼王里面的图片。
Awesome_Tang
2019/07/01
1.5K0
[Python还能干嘛]微信好友头像完成马赛克拼图~
表白神器!如何使用 Python 绘制爱心墙!
聪明的你应该已经发现,在爬取到的头像中有两个头像重复出现(想必这应该是官方默认头像):
AirPython
2021/01/05
1.3K0
表白神器!如何使用 Python 绘制爱心墙!
python实现马赛克拼图!
**命令:python mosaic_v2.py -i "D:\image\pic.jpg" -t "D:\image"
诸葛青云
2019/10/21
1K0
python实现马赛克拼图!
图像分割 | FCN数据集制作的全流程(图像标注)
本文介绍如何使用 PyTorch 实现 FCN 对 PASCAL VOC 数据集进行分类。首先,使用 Docker 安装 PyTorch 和 torchvision,然后使用 torchvision.datasets.VOCSegmentation 载入 PASCAL VOC 数据集。接着,使用 torchvision.models.detection.faster_rcnn.FasterRCNN 将数据集进行分类,并输出预测结果。最后,使用自定义的 colorization 函数将预测结果着色,并保存为图像文件。
码科智能
2018/01/02
5.1K0
图像分割 | FCN数据集制作的全流程(图像标注)
Python获取微信好友头像生成点阵图片
首先是点阵字的概念:点阵字体是把每一个字符都分成 n * n 个点,然后用每个点的虚实来表示字符的轮廓。点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示。
周小董
2019/03/25
1.7K0
Python获取微信好友头像生成点阵图片
算法实现,用机器学习模拟一个opencv的边缘识别算法
所有项目代码: https://github.com/qhduan/tfjs_camera_edge
段清华DEAN
2020/08/06
6190
手把手教你微信好友头像形成指定的文字
3、打开你输入的文件名称的输出文件:例如我输入的是RunWsh,那么文字对应头像图片在RunWsh_输出文件里
程序员小藕
2020/07/28
1.2K0
手把手教你微信好友头像形成指定的文字
用 Python 将 QQ 好友头像生成「 五一快乐」
今天是五一,我们来看一下如何使用 Python 将 QQ 好友头像拼成“五一快乐”四个字。我们可以将整个实现过程分为两步:爬取 QQ 好友头像、利用好友头像生成文字。
Python小二
2020/08/18
6190
用 Python 将 QQ 好友头像生成「 五一快乐」
从零开始制作一个数据集
下载完成之后需要人工筛选一下,里面会夹杂一些乱七八糟的图片,以及主体不是目标的图片,筛选两三遍,最后可能也就找几百张,像前面别人做好的数据集那样一下 60000 张可麻烦了,可以用一些方法让他们翻倍,比如改变一下图片的亮度、对比度、把图片左右反转一下等等
yichen
2021/03/10
1.8K1
基于K-Means聚类算法的主颜色提取
本期我们将一起实现基于K-Means聚类算法的主色提取。在深入研究代码之前,让我们先了解一下K-Means算法的背景知识。
小白学视觉
2020/10/27
2.4K0
基于K-Means聚类算法的主颜色提取
Python:通过wxpy拼接所有微信好友头像
相信微信大家是用得再多也不过了。那么,对于python+微信,又能玩出什么新的花样呢?下面小编就给大家带来一个好玩的东西。用python下载所有的微信好友的头像,然后拼接成一张大图。这样,大家就可以转载到朋友圈装XY了。哈哈。
Freedom123
2024/03/29
1650
Python:通过wxpy拼接所有微信好友头像
Python小工具 | 如何自动下载、压缩并批量替换文章中的外链图片
由于前段时间JsdelivrCDN加速的崩盘,博主存在Github上的图片全部访问失败,文章阅读体验极差,于是2022年以后的文章全部采用npm做图床,在此之前的文章由于数量过多并没有替换。再加上之前一直忙着研一阶段的期末考,懒得动博客。幸好这段时间有空,于是写了个python小工具来替换博客中外链图片,具体流程如下:
Justlovesmile
2022/09/02
7660
20+个很棒的 Python 脚本的集合(迷你项目)
💂 个人网站:【海拥】【摸鱼小游戏】【神级源码资源网站】 🤟 风趣幽默的前端学习课程:👉28个案例趣学前端 💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 💬 免费且实用的 前端刷题(面经大全)网站:👉点击跳转到网站 1.将 JSON 转换为 CSV import json if __name__ == '__main__': try: with open('input.json', 'r') as f: data = json.loads
海拥
2022/11/21
8450
#Python小技巧#教你用Python在Excel里画画
实现这个需求的基本思路是读取这张图片每一个像素的色彩值,然后给 excel 里的每一个单元格填充上颜色。所以主要用到的是PIL、openpyxl这两个库。
程序员迪迪
2021/12/20
6700
微信头像加国旗
还记得当时刷屏朋友圈的@微信官方,给自己头像加国旗吗?本文教大家用十三行Python代码实现该功能。
阿黎逸阳
2020/09/08
1.7K0
Python的人脸自动戴口罩系统
2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩、酒精、消毒液奇货可居。
IT茂茂
2020/03/05
7480
Python的人脸自动戴口罩系统
相关推荐
教你用Python制作微信好友背景墙
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验