Python生成马赛克图片

使用Python简单实现马赛克拼图 先上效果图 这是原图: 思路: 拼图的原理其实很简单,就是把原图划分成很多个小块,然后根据灰度或者rgb搜索图库中最相似的图片进行替换。接下来的问题就是如何实现图片搜索。这里可以参考阮一峰的博客 上代码: 第一步:获取目标图片的尺寸,计算每个子图的大小。例如:目标图片的尺寸为1600x1280,计算出这个尺寸的最大公约数为320,即拼出的图片由每行每列都有320张小图... 阅读详情
import ctypes
import re
import numpy as np
from numpy import ctypeslib
import os
import cv2
import multiprocessing as mp
from multiprocessing.sharedctypes import RawArray
from scipy.spatial.distance import euclidean
from tqdm import tqdm

IMG_DIR = "images"
RATIO = 10

def resize(im, tile_row, tile_col):
    shape_row = im.shape[0]
    shape_col = im.shape[1]
    shrink_ratio = min(shape_row/tile_row, shape_col/tile_col)
    resized = cv2.resize(im, (int(shape_col/shrink_ratio)+1, int(shape_row/shrink_ratio)+1), interpolation=cv2.INTER_CUBIC)
    result = resized[:tile_row, :tile_col,:]
    return result

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

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)

def find_closest_image(q, shared_tile_images, tile_images_shape, shared_result, img_shape, tile_row, tile_col):
    tile_images_array = np.frombuffer(shared_tile_images, dtype=np.uint8)
    tile_images = tile_images_array.reshape(tile_images_shape)
    while True:
        [row, col, im_roi] = q.get()
        print(row)
        min_dist = float("inf")
        min_img = None
        for im in tile_images:
            dist = img_distance(im_roi, im)
            if dist < min_dist:
                min_dist = dist
                min_img = im
        im_res = np.frombuffer(shared_result, dtype=np.uint8).reshape(img_shape)
        im_res[row:row+tile_row,col:col+tile_col,:] = min_img
        q.task_done()

def get_tile_row_col(shape):
    if shape[0] >= shape[1]:
        return [120, 90]
    else:
        return [90, 120]

def generate_mosaic(infile, outfile):
    img = cv2.imread(infile)
    tile_row, tile_col = get_tile_row_col(img.shape)
    img_shape = list(img.shape)
    img_shape[0] = int(img_shape[0]/tile_row) * tile_row * RATIO
    img_shape[1] = int(img_shape[1]/tile_col) * tile_col * RATIO
    img = cv2.resize(img, (img_shape[1], img_shape[0]), interpolation=cv2.INTER_CUBIC)
    print(img_shape)
    im_res = np.zeros(img_shape, np.uint8)
    tile_images = load_all_images(tile_row, tile_col)
    shared_tile_images = mp.sharedctypes.RawArray(ctypes.c_ubyte, len(tile_images.flatten()))
    tile_images_shape = tile_images.shape
    np.copyto(np.frombuffer(shared_tile_images, dtype=np.uint8).reshape(tile_images_shape), tile_images)
    shared_result = mp.sharedctypes.RawArray(ctypes.c_ubyte, len(im_res.flatten()))

    q = mp.JoinableQueue()
    for i in range(5):
        p = mp.Process(target=find_closest_image,
            args=(q, shared_tile_images, tile_images_shape, shared_result, img_shape, tile_row, tile_col),
            daemon=True)
        p.start()
        print("started process")

    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,:]
            q.put([row, col, roi])

    q.join()
    cv2.imwrite(outfile, np.frombuffer(shared_result, dtype=np.uint8).reshape(img_shape))

if __name__ == "__main__":
    generate_mosaic("test.jpg", "out.jpg")

 

python 加马赛克 阅读详情

相关推荐

马赛克(蒙太奇)图片生成--Python实现

马赛克(蒙太奇)图片生成 观察上面一张图我们可以发现,图片大致为一个蒙娜丽莎的画像,但是又有些不太一样。图片由一个个块组成,每一个块都是一张另外的图片,那么要实现这样的效果,我们应该怎样做呢?用一句话来概括就是将计算目标图片中的不同的块和数据集中源图片的相似度,选择相似度最高的进行替换。 假设图片是RGB三通道的,我们可以分别求出来块的三个通道的均值,然后再比较块和源图片三通道数值之间的欧式距离,卡方距离或者其它距离,最终完成比较和替换。 import cv2 import os import matpl

小吴同学的小屋 4936

opencv-python图像增强十六:图像马赛克

在数字时代,图像处理已成为我们日常生活中不可或缺的一部分。无论是社交媒体上的照片编辑,还是专业领域的图像分析,图像处理技术都发挥着至关重要的作用。今天,我们将一起探索图像处理领域的一个有趣应用——图像马赛克。马赛克作为一种艺术形式,自古以来就广受欢迎。它通过将小块的彩色材料拼接在一起,创造出美丽的图案和画面。而在数字图像处理中,马赛克效果则是一种将图像分解成若干小块,并通过某种方式(如平均颜色)重新组合的技术。这种效果不仅具有艺术价值,而且在隐私保护、数据压缩等方面有着广泛的应用。

HanWenKing的博客 1733

实现可逆加噪图片混淆器:马赛克解码器

随着信息技术的发展,数字图像在各个领域的应用越来越广泛,随之而来的是对图像安全和隐私保护的需求不断增长。图片混淆技术应运而生,它是信息安全领域的一个重要分支,旨在通过一系列算法处理,使原始图像在视觉上无法被直接辨识,但又能在需要时恢复原貌。在深入探讨图片混淆技术之前,我们必须理解它的基本原理和应用。简单的说,图片混淆就是将原始的图像数据进行某种形式的变形,使得图像信息被“隐藏”起来。这样的处理可以防止敏感图像被非授权访问,同时也是保护数据隐私的有效手段。

weixin_31869917的博客 7267

Python 图像打马赛克

图像打马赛克

CXY00000的博客 507

论文阅读:SuperGaussians: Enhancing Gaussian Splatting Using Primitives with Spatially Varying Colors

Gaussian Splattings 在基于高斯显式表示的多视图重建中展示出了令人印象深刻的结果。然而,当前的高斯基元只有单视图依赖的颜色和不透明度来表示场景的外观和几何形状,导致了一种非紧凑的表示。在本文中,我们引入了一种名为“超高斯(SuperGaussians)”的新方法,它在单个高斯基元中利用空间变化的颜色和不透明度来提高其表示能力。我们实现了双线性插值、移动核,甚至是小型神经网络作为空间变化函数。

m0_48319749的博客 1508

TensorFlow_PyTorch实战:构建AI人工智能回归模型

回归分析是机器学习的核心任务之一,用于预测连续型目标变量(如房价、股票价格、用户留存时间等)。基础线性回归模型的数学原理与代码实现多项式回归模型的过拟合处理与正则化技巧自定义数据集加载与数据预处理流程动态图(PyTorch)与静态图(TensorFlow)的编程范式对比模型评估指标与可视化分析方法核心概念:对比两大框架的架构设计,解析回归模型核心组件数学原理:推导线性回归的假设函数、损失函数及优化算法算法实现:提供TensorFlow和PyTorch的完整代码示例项目实战。

AI天才研究院 1429

用Python生成马赛克画

马赛克画是一张由小图拼成的大图,本文的封面就是我们的效果图,放大看细节,每一块都是一张独立的图片,拼在一起组成一张大图,感觉像是用马赛克拼出来的画,所以叫马赛克画。看到网上的一些马赛克画觉得很酷,于是自己用Python实现了一下将一张原图转换成马赛克画。 我们的效果图是这样的 原图是这样的 实现的具体思路是这样 第一步:首先收集一组图片,这些图片会作...

weixin_34355559的博客 635

Python抓取摄像头图像,进行AI识别(一)

本文介绍了如何用Python获取海康威视摄像头的图像并进行AI识别。主要内容包括:1)准备工作,包括摄像头IP设置和密码重置方法;2)使用Python的Requests库通过ISAPI接口获取实时图像;3)示例代码展示如何保存摄像头图像。整个过程为后续AI图像识别提供了基础,通过简单的Python代码即可实现专业监控设备的图像采集功能。

Hahafantuan的博客 1513

python图片马赛克_python生成马赛克图片

下方注释的是爬取图片的爬虫爬取的图片集放在同级目录image文件夹下,每一个像素点都是一个图片import osimport sysimport timeimport mathimport numpy as npfrom PIL import Image, ImageOpsfrom multiprocessing import Poolfrom colorsys import rgb_to_hsv...

weixin_39770165的博客 540

Opencv全景图像处理实战:柱面与透视展开技术详解

本文详细解析了使用OpenCV实现全景图像处理的两种核心技术:柱面展开与透视展开。通过原理拆解与实战代码演示,指导开发者将360度环绕的鱼眼或球面图像转换为可用的平面视图,适用于街景展示、车载环视、室内测量等计算机视觉应用场景。

weixin_29081163的博客 582

iTerm2+oh-my-zsh最全配置

iTerm2+oh-my-zsh最全配置安装前先看效果图一.安装[iTem2](https://iterm2.com/)二.安装[oh-my-zsh](https://ohmyz.sh/)三.安装[Powerline](https://powerline.readthedocs.io/en/latest/installation.html)四.安装 [Meslo](https://github.com/powerline/fonts) 字体库五.安装agnoster主题六.安装语法高亮七.安装代码补全插件八

xinximo的博客 2610

美翻你的朋友圈,Python生成蒙太奇马赛克图片

我们有时候会听到这么一个词–“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生各个镜头单独存在时所不具有的特定含义。这就是我们经常听到了蒙太奇手法,在电影《飞屋环游记》中皮克斯运用蒙太奇手法,用一个不到5分钟的短片展现了主角的大半人生,感动无数观众。下面我们就看看今天的内容同蒙太奇有何关系。

ZackSock的博客 4766

Backblaze 2025全年硬盘故障率报告解读

作为长期追踪存储行业动态的科技博主,每年/季度Backblaze的Drive Stats报告都是我重点关注的核心内容——不同于厂商发布的实验室数据,Backblaze以近13年、数十万片企业级硬盘的真实运行数据为基础,其年化故障率(AFR)、寿命趋势等结论,直接反映了硬盘在严苛数据中心环境下的真实表现,无论是企业存储选型还是个人高端存储参考,都具备极高的实用价值。2025年末,Backblaze发布了第13年的年度收官报告,涵盖2025年Q4、全年及终身硬盘可靠性数据。

存储随笔 4014

img下面的png图片 vs 读不出来_美翻朋友圈:用Python生成蒙太奇马赛克图片

题图 | 视觉中国来源 | ZackSock(ID:ZackSock)我们有时候会听到这么一个词--“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生各个镜头单独存在时所不具有的特定含义。这就是我们经常听到了蒙太奇手法,在电影《飞屋环游记》中皮克斯运用蒙太奇手法,用一个不到5分钟的短片展现了主角的大半人生,感...

weixin_30114977的博客 225

GJB设计开发各阶段的文件和记录要求

GJB设计开发各阶段的文件和记录要求

Abel的博客 4051

YOLO+OpenClaw缺陷检测智能体 | 低代码工业质检自动化方案 | 含YOLO模型训练/智能体集成/任务全流程,支持离线日报/预警/趋势分析,解决实时性瓶颈问题(下篇)

某PCB板制造商需要对生产线上的PCB板进行缺陷检测,主要检测划痕、凹坑、污渍和裂纹等缺陷。原有人工检测方式效率仅为200件/小时,漏检率达5%,且检测人员长期工作易疲劳。

qq_36130719的博客 205

python 生成图片_美翻你的朋友圈,Python生成蒙太奇马赛克图片

一、前言我们有时候会听到这么一个词--“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生各个镜头单独存在时所不具有的特定含义。这就是我们经常听到了蒙太奇手法,在电影《飞屋环游记》中皮克斯运用蒙太奇手法,用一个不到5分钟的短片展现了主角的大半人生,感动无数观众。下面我们就看看今天的内容同蒙太奇有何关系。二、效果...

weixin_39542111的博客 114

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

美翻朋友圈:用Python生成蒙太奇马赛克图片

题图 | 视觉中国来源 | ZackSock(ID:ZackSock)我们有时候会听到这么一个词--“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延...

AI科技大本营 1320

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java、python制作马赛克图片

最近发现这个马赛克图片很有趣,所以就在网上找了一个简单的python库来使用,因为都是封装好的,所以使用起来很简单。 python库:photomosaic 准备图片 因为制作图片都是封装好的代码,所以唯一麻烦的就是需要数千张不同的图片。这样的话,比较好的解决方法是使用爬虫一类自动采集的程序,在网络上爬取图片。不过,我为了省事,就简单来处理了。 这里我使用Java程序来生成自己需要的图片。 下面代...

qq_40734247的博客 682

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Python学习笔记_多张图片生成马赛克图

原文链接:使用Python简单实现马赛克拼图 代码如下: import os import time from functools import reduce from threading import Thread from PIL import Image class MosaicMaker(object): # 内部类,执行多线程拼图的任务类 class __SubTask: def __init__(self, n, cur_sub_im, new_im, m.

hahalan的博客 587

python色块图_美翻你的朋友圈,Python生成蒙太奇马赛克图片

一、前言我们有时候会听到这么一个词--“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生各个镜头单独存在时所不具有的特定含义。这就是我们经常听到了蒙太奇手法,在电影《飞屋环游记》中皮克斯运用蒙太奇手法,用一个不到5分钟的短片展现了主角的大半人生,感动无数观众。下面我们就看看今天的内容同蒙太奇有何关系。二、效果...

weixin_39985472的博客 674

公众号 自动生成海报 python_美翻你的朋友圈,Python生成蒙太奇马赛克图片

一、前言我们有时候会听到这么一个词--“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生各个镜头单独存在时所不具有的特定含义。这就是我们经常听到了蒙太奇手法,在电影《飞屋环游记》中皮克斯运用蒙太奇手法,用一个不到5分钟的短片展现了主角的大半人生,感动无数观众。下面我们就看看今天的内容同蒙太奇有何关系。二、效果...

weixin_39705435的博客 476

opencv 图片截取圆_美翻你的朋友圈,Python生成蒙太奇马赛克图片

一、前言我们有时候会听到这么一个词--“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往往又会产生各个镜头单独存在时所不具有的特定含义。这就是我们经常听到了蒙太奇手法,在电影《飞屋环游记》中皮克斯运用蒙太奇手法,用一个不到5分钟的短片展现了主角的大半人生,感动无数观众。下面我们就看看今天的内容同蒙太奇有何关系。二、效果...

weixin_34513436的博客 261

如何破解《楚门的世界》马赛克海报?附完整教程!

点击上方“蓝字”关注我们看了电影《楚门的世界》的海报,是不是觉得特别炫酷?将各个图片拼在一起,最后呈现为主角,在那个年代,这种海报制作堪称一绝!别羡慕,你也可以完成!在开始之前,你有没有想...

实验楼 2443

python快速实现图片的马赛克化

马赛克在古希腊和罗马时期广泛使用,用于装饰建筑物、浴室、庭院等。它由小块石材、玻璃、陶瓷或其他材料组成,通过粘合剂固定在表面上,形成各种图案和图像。马赛克在艺术和建筑领域一直被广泛使用,成为一种独特而美丽的装饰形式。马赛克图片是一种由小块像素组成的图像。它通过将原始图像分割成许多小方块或像素,并使用不同颜色或灰度值填充每个小方块来创建。这些小方块可以是正方形、长方形或其他形状,它们的颜色或灰度值根据原始图像的颜色或灰度值来确定。马赛克图片常用于保护隐私,对敏感信息进行模糊处理,或者用于艺术创作和装饰。

ASS-ASH的博客 1021

用python画梵高星空_用Python生成马赛克画

大家知道马赛克画是什么吗?不是动作片里的马赛克哦~~马赛克画是一张由小图拼成的大图,本文的封面就是我们的效果图,放大看细节,每一块都是一张独立的图片,拼在一起组成一张大图,感觉像是用马赛克拼出来的画,所以叫马赛克画。看到网上的一些马赛克画觉得很酷,于是自己用Python实现了一下将一张原图转换成马赛克画。封面的原图是这样的实现的具体思路是这样第一步:首先收集一组图片,这些图片会作为大图中的小方格图...

weixin_39540018的博客 3801
上一篇: 搭建Spring MVC框架(一站式服务)
下一篇: 通过handler类向线程的消息队列发送消息
OneLinee
博客等级 码龄10年 11粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值