numpy还可以这样用


昨晚发了接受投稿文章,昨晚就有读者积极来文章啦,几轮邮件交流了修改意见后,今天就发布啦,这篇的稿费是300。

之前无聊在刷视频的时候看到这么一个有意思的视频(现在视频找不到,忘记关键字了= =),视频的内容大概是这样的:一张狗狗的侧脸照片,经过碎纸机,横的切成若干条,并且没有打乱,随后隔条分成了两份,然后把这两份各自拼接在一起,出现了两张狗狗的图片(B图和C图)。

如下图:把A图分成了B和C两张图片
A图

B图



C图

如上图A,B,C,图片上的狗狗其实是同一个,利用原图A,把A等分成若干份,分别给B,C,然后再次拼接在一起,于是形成了B,C两张图片。


 如何实现?
想实现视频中的效果,你可以手工做,先打印那么一张狗狗的图片,然后裁剪,拼装,但是很麻烦而且要有耐心。会Numpy图像处理的话,我们就可以用计算机的方式来实现这个现象。

Numpy对图像的处理实际上就是对ndarray的处理。图像和ndarray又有什么关系呢?图像是可以用ndarray数组来表示。如图我们可以用plt.imread()读取一张图片的数据,返回的就是这张图片的ndarray数组。


a.shape()查看数组的形状
其中(347,500,3), 500代表图片的长度,347代表图片的宽度,3代表RGB(通道数,有些图片格式是3通道,有些图片格式是4通道)。

所以我们可以将一张图片看作一个ndarray,而numpy库可以对ndarry进行处理,主要操作就是对数组的拆分,以及数组的拼接。
 
准备工作:首先从某网站上下载了一张狗狗的照片= =。

我们用numpy来处理图像。注:使用numpy库来对图像进行处理。这里我们使用matplotlib.pyplot的相关方法来辅助。

主要用到的函数方法:

  • plt.imread:读取图像,返回ndarray的数组。
  • plt.imshow:显示图像。
  • plt.imsave:保存图像。
  • np.split:数组的分割,分割图像。
  • np.concatenate:数组的拼接,拼接图像。
  • ps:imread方法默认只能处理png格式的图像,如果需要处理其他格式的图像,需要安装pillow库。这里下载的图片是jpg格式的,所以在读取的时候会报错。偷懒一下,用ps打开重新用png格式保存了一下,另外直接重命名原图为png也是不行的哦。。。

第一步:导入图片

# 导入库
Import numpy as npImport matplotlib.pyplot as plt# 读取图像数据a = plt.imread(u"狗狗.png")


第二步:对图像进行分割

#读取图像的width,方便对其进行拆分width = a.shape[1]#将图片竖着切分成若干份:将数组以列来进行切分(axis = 1),分成两组li = np.split(a, range(10, width,10), axis=1)   #这里我们将图片分割成若干宽度为10的长条li1 = li[::2]  #利用切片操作,设置步长为2,相当于从第一条开始,隔条取出,即取出奇数的图片li2 = li[1::2]  #利用切片操作,设置步长为2,相当于从第二条开始,隔条取出,即取出偶数的图片


第三步:合并图像:将数组合并在一起

# 把数组合并,相当于把第一个容器中的图片拼接起来。a1 = np.concatenate(li1,axis=1)  # 把数组合并,相当于把第二个容器中的图片拼接起来。a2 = np.concatenate(li2,axis=1)

第四步:显示图像(放在一起显示,可以对原图和产生的两张图片进行比较)

Fig, ax = plt.subplots(3)Fig , set_size_inches(10, 10)#原图ax[0].imshow(a)#图1ax[ 1].imshow(a1)  #图2ax[2].imshow(a2) plt.tight_layout()

最终的结果如图:分割的宽度越小,拼接出来的图片内越真实
切分宽度为5

切分宽度为20

大家可以试着切分更多的条数,或者打乱顺序来拼接图片来看看最终的效果,是不是很神奇呢= =。


这个技术可以运用在哪儿呢?

在图片原创欺骗上可能有些用途,其他的用途还没想到。


本文是由猿人学读者:Mujor的投稿

继续接受投稿中啦,快来投稿噢,稿费300-500。


相关阅读:

来通过写技术文章挣钱

用Python写了个检测抄袭/文章去重算法

python玩转pdf全攻略

20行代码手撸一个命令行英汉翻译工具

用Python给我家宝宝写个小软件


太无聊了,欢迎加我微信交流:

爬虫/Web/文本分析技术

备注:交流

评论