【Python 项目】照片马赛克 - 1

2024-07-19 1166阅读

照片马赛克 - 1

  • 开始
    • 工作原理
      • 分割目标图像
      • 平均颜色值
      • 匹配图像
      • 所需模块

        照片马赛克是一张图像,它被分割成长方形的网格,每个长方形由另一张匹配“目标”的图像(最终希望出现在照片马赛克中的图像)替代。换言之,如果从远处看照片马赛克,会看到目标图像;但如果走近,会看到该图像实际上包含许多较小的图像。这个迷题有解是因为人眼的工作方式。下图中的低分辨率块状图像,靠近了很难识别,但如果从远处看,就知道它代表什么,因为看到的细节较少,就使得边缘越光滑。照片马赛克的原理是相似的。从远处看,图像看起来正常,但走近时,秘密揭开了:每“块”都是一个独特的图像!

        【Python 项目】照片马赛克 - 1

        开始

        本项目中,我们将学习如何用 Python 创建照片马赛克。我们将目标图像划分成较小图像的网格,并用适当的图像替换网格中的每一小块,创建原始图像的照片马赛克。你可以指定网格的尺寸,并选择输入图像是否可以在马赛克中重复使用。

        在这个项目中,你将学习如何做到以下几点:

        • 用 Python 图像库(PIL)创建图像;
        • 计算图像的平均 RGB 值;
        • 剪切图像;
        • 通过粘贴另一张图像来替代原图像的一部分;
        • 利用平均距离测量来比较 RGB 值。

          工作原理

          要创建照片马赛克,就从目标图像的块状低分辨率版本开始(因为在高分辨率的图像中,小块图像的数量会太大)。该图像的分辨率将决定马赛克的维度 M×N(M 是行数,N 是列数)。接着,根据这种方法替换原始图像中的每一小块:

          1. 读入一些小块图像,它们将取代原始图像中的小块;
          2. 读入目标图像,将它分割成 M×N 的小块网格;
          3. 对于每个小块,从输入的小块图像中找到最佳匹配;
          4. 将选择的输入图像安排在 M×N 的网格中,创建最终的照片马赛克。

          分割目标图像

          按照下图中的方案,开始将目标图像划分成 M×N 的网格。

          【Python 项目】照片马赛克 - 1

          图像展示了如何将原始图像分割成小块的网格。 x 轴表示网格的列,y 轴表示网格的行。

          现在,看看如何计算网格中一个小块的坐标。下标为(i,j)的小块,左上角坐标为 (iw, ij),右下角坐标为((i+1)*w, (j+1)*h),其中 w 和 h 分别是小块的宽度和高度。PIL 可以用这些数据,从原图像创建小块。

          平均颜色值

          图像中的每个像素都有颜色,由它的红、绿、蓝值来表示。在这个例子中,使用 8 位的图像,因此每个部分有 8 位值,范围在[0,255]。如果一幅图像共有 N 个像素,平均 RGB 计算如下:

          r , g , b { r 1 + r 2 + . . . + r n N , g 1 + g 2 + . . . + g n N , b 1 + b 2 + . . . + b n N } r,g,b \left\{\begin{aligned} \end{aligned} \right.\frac{r_1+r_2+...+r_n} {N}, \frac{g_1+g_2+...+g_n}{N}, \frac{b_1+b_2+...+b_n}{N}\left.\begin{aligned} \end{aligned}\right\} r,g,b{​Nr1​+r2​+...+rn​​,Ng1​+g2​+...+gn​​,Nb1​+b2​+...+bn​​​}

          请注意,平均 RGB 也是一个三元组,不是标量或一个数字,因为平均值是针对每个颜色成分分别计算的。计算平均 RGB 是为了匹配图像小块和目标图像。

          匹配图像

          对于目标图像中的每个小块,需要在用户指定的输入文件夹的一些图像中,找到一幅匹配的图像。要确定两个图像是否匹配,就使用平均 RGB 值。最接近的匹配就是最接近平均 RGB 值的图像。

          要做到这一点,最简单的方法是计算一个像素中 RGB 值之间的距离,以便从输入图像中找到最佳匹配。对于几何中的三维点,可以用以下的距离计算方法:

          D 1 , 2 = ( r 1 − r 2 ) 2 + ( g 1 − g 2 ) 2 + ( b 1 − b 2 ) 2 D_1,_2 = \sqrt { (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 } D1​,2​=(r1​−r2​)2+(g1​−g2​)2+(b1​−b2​)2 ​

          这里计算了点 (r1, g1, b1) 和 (r2, g2, b2) 之间的距离。给定一个目标图像的平均RGB 值,以及来自输入图像的平均 RGB 值列表,你可以使用线性搜索和三维点的距离计算,来找到最匹配的图像。

          所需模块

          这个项目将使用 Pillow 读入图像,访问其底层数据,创建和修改图像。还会用numpy 来操作图像数据。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]