计算机系统应用教程网站

网站首页 > 技术文章 正文

骚操作!图片缩小后 内容竟变得完全不同?

btikc 2024-10-12 10:15:44 技术文章 19 ℃ 0 评论

项目介绍

大家好,又到了愉快的周末,前段时间再B站看到一个骚操作。

图片缩小后 内容竟变得完全不同!妥妥的加密神技,背后的原理是我们图像处理中的常用操作。最近邻插值的妙用!

视频来源:https://www.bilibili.com/video/BV1Lf4y1r7dZ

原理分享

通过放大图片观察可以看到,其实在大图上面存在一些貌似有规律的点,如下所示:

实际上这些点是组成 小图 的点

当对大图进行缩小时,图片显示的结果就是上面一些小点。

那么的大家肯定会有疑问:

1、为什么插入的点,缩小后会变成完全不同的图

2、如何将这些点插入进去



1、为什么插入的点,缩小后会变成完全不同的图

这里需要提前讲解一下图像缩放的原理(知识点!):

图像缩放(image scaling)是指对数字图像的大小进行调整的过程。

这里涉及到的图片的缩小,即从较大尺寸的图片转换为较小尺寸的图片。

这里仅介绍最近邻法插值:

概念:将变换后的图像中的原像素点最邻近像素的灰度值赋给原像素点的方法。

下面这张图可以清晰解释最近邻的实现原理(放大的情况)

下面这张图可以清晰解释最近邻的实现原理(缩小的情况)

假设原图如下所示,图片的尺寸是 3 x 9

此时,在使用最近邻缩放时,且缩放的倍数为 3 时,会默认时用中间的红色方块来代替,进行三倍缩小后的最终效果如下:

使用这种方法来显示你想要实现的效果有两个条件:

1、缩放时采用最近邻缩放

2、已知缩放的倍率或尺寸

这里作者给的demo 都是缩放 10 倍的,如果图片的尺寸有区别需要自定义。

使用上面的骚操作,还能干坏事呢。不,还能干什么大事呢?

比如,学习资料的传播

表面上是一张妹子的图,缩放后:

是一份正经的学习资料!

就问你服不服!‘

代码如下:

import sys
from PIL import Image


#将small_img中的像素用近邻法嵌入到big_img中
def my_nearest_resize(big_img, small_img):


    big_w, big_h = big_img.size 
    small_w, small_h = small_img.size 


    dst_im = big_img.copy()


    stepx = big_w/small_w
    stepy = big_h/small_h


    for i in range(0, small_w):
        for j in range(0, small_h):
            map_x = int( i*stepx + stepx*0.5 )
            map_y = int( j*stepy + stepy*0.5 )


            if map_x < big_w and map_y < big_h :
                dst_im.putpixel( (map_x, map_y), small_img.getpixel( (i, j) ) )


    return dst_im






if __name__ == '__main__':
    big_img=Image.open(sys.argv[1])     # 大图
    small_img=Image.open(sys.argv[2])   # 小图


    dst_im = my_nearest_resize(big_img, small_img)
    dst_im.save(sys.argv[3])            # 嵌入小图像素的大图

项目链接:https://github.com/3150601355/SimpleScaleDown

视频来源:https://www.bilibili.com/video/BV1Lf4y1r7dZ

本文是在这位仁兄上面学到的,佩服佩服!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表