Python 图像 一样大小_#带你学Python# 表白利器:用Python发微信表情画-带你认识图片的秘密...

87dd4d9b292987e804b4fcd4ba4e78c1.png

首先感谢大家对上篇文章“python实现传染病模型”的肯定:

孙小白:#带你学Python# 疫情当前,在家没事?你也可以用Python预测疫情发展​zhuanlan.zhihu.com
4e1d191ca7add0a6d03e5219c03d2a7b.png

感谢大家的评论,私信和交流。你们的肯定是我继续更新的动力!

应大家的要求,这里补充一下上篇文章的源码连接(包括:SEIR, SI, SIR模型实现和粒子群算法拟合实际数据,欢迎交流学习)

https://github.com/XuelongSun/Dynamic-Model-of-Infectious-Diseases​github.com

上篇文章,紧跟热点,但好像有些严肃了。今天我们轻松一下,学一点好玩的:

1d86dd2d1836ea7a7bf0693b3706f8d8.png
这是今天的学习目标~ 哈哈哈

看了这篇文章,你就可以很轻易地发出这样效果的微信消息,不仅是爱心哦,可以是任何你想要的形状。

行动起来,来一场有趣的告白(撩骚)吧!

1.从图片谈起

如果我问你,什么是图片/照片/图像/image/picture?

你脑海里可能是这样的:

f69323ac4c678b5ccaff14f9727be7b8.png

这样的:

baca6461f71c4905a7d6e79aadd3bdb8.png

或者是这样的(emm!嗯):

07cf74b374dc66e35bc555ae994b3588.png

和这样的:

896d169277a3f59af4c5ddf2848ee282.png

但,如果你问一个做图像处理的研究生,或者是做图像的程序员,他们的脑海里是这样的:

3a2ede56a575145772b745f048af223f.png

对的,矩阵化和数字化。

任何一张图片的计算机本质都是一个二维的数据矩阵。

不信?实践是检验真理的唯一标准。来,打开你的python jupyter lab. 让我们代码敲起来!

还没有安装jupyter lab的同学,看这里:

孙小白:#带你学Python# 搭建Python环境,第一次触摸Python​zhuanlan.zhihu.com
f0e04bde73346f2dc365dff3012fc572.png

今天我们要用到Python扩展包有:numpy, matplotlib 和 cv2. 前两个我们上篇文章已经安装啦,cv2我们还是使用pip安装:

pip install opencv_python

cv2是opencv的python版本,是个非常强大的图像处理工具包。感兴趣的可以了解更多:

https://pypi.org/project/opencv-python/​pypi.org

导入这三个包之后:

import 

敲入如下代码,运行:

image 

你将会看到类似这样美丽的马赛克:

ea3992ef2cc92df1f07be62ff81a77e6.png
5x5的矩阵 就是一张5x5像素的图片,哪怕它是马赛克

我们来看看image的值:是一个5x5的浮点数矩阵

cf28140859fcb8a3132a45298c624402.png

这个值是由numpy的random模块产生的:

image 

调用random函数随机产生一个5x5在区间[0,1)的符合均匀分布的浮点数。因为是随机的,所以你产生的马赛克和我的可能不太一样,但都很好看,因为我们使用了matplotlib的内建colormap,也就是代码:

ax

中的cmap所给的值,它将矩阵中的值和具体的颜色建立一一对应的关系(map的含义), 究竟和什么样的颜色建立关系,就由不同的cmap决定了。 更多cmap可以在这里找到:

Choosing Colormaps in Matplotlib​matplotlib.org
247cb364a68f11eaa1562db0efa976c7.png

其实,cmap在这里只是帮我们显示图片,这个概念不是重点啦。

ax

的意思是不显示坐标轴,你可以注释掉这句话,再运行看看效果。

看到这里你可能觉得是这不是真正的图片,是matplotlib在搞什么不懂得鬼。那好,我们下面来动真格的啦。你可以用如下方式,利用cv2读入一张图片,用和上面一样的方法进行显示:

80c608dd04e96513a5b3476d6d799fdd.png
利用cv2读入一张图片

然后我们再来看看image的值:

8d1f19c3fdea7bf89299f443594c8cfa.png
你怎么也想象不到,这样的数字代表的是我们的银河系

是不是,有点感觉啦?我们再来看看image的维度信息:

image

会输出:(486, 720, 3)。所以这是一个486x720x3的矩阵,虽然是三维,但是本质上是一个二维,因为最后的3是表示红绿蓝三个分量的色彩信息。

如果你只给程序员说,有一个486x720x3的矩阵表示一个图像,那么他就知道,这是一张长为486像素,高为720像素的彩色图像。

关于色彩,说起来,又是一本书啦。我们有机会再探索。我们今天要实现的那个表情文字懂得灰度图就够啦。什么是灰度图?说白了就是黑白照片。来,我们操作一下,稍微修改一下上面的代码。

# 将读入模式设置成灰度grayscale
image = cv2.imread('galaxy.png',cv2.IMREAD_GRAYSCALE)
fig,ax = plt.subplots()
# cmap记得改为'gray',否则还是会用cmap映射成一种虚假的彩色,不过你可尝试,看看效果如何。
ax.imshow(image, cmap='gray')
ax.set_axis_off()

af6a06b4e33ad6afd04553b2e51fcb55.png

然后我们再看看image的维度信息:

image.shape

输出是(486, 720),看到了把,最后那个表示颜色的维度不见了。

为了对灰度图有更直观的认识,我们自己动手画一个吧。就画它:

38d4cf9a913912645b3d8302ae900656.png
丑拒.jpg (from Baidu)

怎么画?我是程序员,我要写矩阵:

623156d4074ec74752e9ef9acac56545.png
数数,图像长和高是不是和矩阵的行和列一样哇

好了,矩阵写好了,我们把它拷贝到程序里:

# 程序员画的画,你不懂
img = [[1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1],
       [1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1],
       [1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1],
       [0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1],
       [0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1],
       [0,1,1,1,.5,1,1,1,1,.5,1,1,1,0,1,1,1],
       [0,1,1,1,1,.5,.5,.5,.5,1,1,1,1,0,1,0,0],
       [0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0],
       [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],
       [0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1],
       [0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1],
       [0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1],
       [0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1],
       [0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1]]

# 显示出来你才懂
fig,ax = plt.subplots()
ax.imshow(img,cmap='gray')
ax.set_axis_off()

来运行一下, 看看效果:

f2df8a6e3ae21db6270ebe9aa047046f.png

不好意思,丑拒!

当然你还可以保存到本地,用来丑拒别人。

# 保存
# 乘以255的原因是png默认灰度最大值为255,也就是2^8-1
img = np.array(img) * 255
cv2.imwrite('too ugly to accept.png', img)

img是个14x17的矩阵,里面只有三种值,0,0.5,1。你会发现值越大,生成的像素越白(越亮),嘴巴是0.5,所以是介于黑白之间的灰色。这就是灰度的意义。

2.学以致用,我们来发微信表情吧

21024b30f7b2e5fe84b9c21c0529e8e8.png

仔细观察这个'表情阵列',联想一下我们刚学习的图片的知识。有没有什么发现?

嗯呐!如果你把'猪头'看成白色像素,'玫瑰’看成黑色像素。那他是不是变成了一个12x12的图片呀:

2573167598b3367e5fa348eafaa7288b.png

也就是一个12x12的矩阵嘛:

img_heart 

好啦,现在有了这个矩阵,我们要做的就是把它换回去,换成微信的头像。

下面的这段代码实现这个功能,需要用到之前的知识(字符串,for循环等),请参看:

孙小白:#带你学Python# 从简单程序出发理解Python基本语法​zhuanlan.zhihu.com
61e808be6b6eb7533406389ac1be1137.png
# 空字符串,用于保存要发送的内容

/猪头,/玫瑰 这些都是微信表情的中文编码,也就是说你在聊天窗口打‘/猪头’然后发送,和你直接发猪头表情的效果是一样的。

你可以在这里查到更多的微信表情的中英文代码:

微信中的表情符号代码对照表 - 水车 - 博客园​www.cnblogs.com
a880ef901c24bba4175a4cd789feafdd.png

运行代码:

62fd543b60409d2adcd66f3a1b57ebf4.png

输出了一个很长的字符串,拷贝下来,发送给你的TA把(哈哈哈哈)。

微信电脑版每一行是9个表情,所以会发生错乱,显示不正确的,要用手机看,手机是每行12个表情。为了手机党的方便,你可以翻到本文最后,我有分享几个生成好的,点赞之后,直接复制,就可以啦~

3.进阶版,不画画啦,咱们写字~

先上代码:

# 放入你要写字

运行:

fd2d71200bc92948a78d532a854c32a2.png

哈哈,得到我们想要的字啦。这段的核心代码是:

img_wechat 

利用cv2自带的函数putText(),各个参数什么意思大家可以老方法help()去查看。这里给出简要解释:

  1. 原图像,就是在哪个图像上写字,这里给的是我们定义的白色背景图img_wechat
  2. 要写的字,这里用i遍历我们想要写的字列表['L', 'O', 'V', 'E']
  3. 所写字的左下角像素坐标,因为我们是竖着写的LOVE,每个字都写在一个width*width的图片上,所以每写完一个字,就要把坐标下移一个width,否则字就会重叠在一起。
  4. 字体,这里是cv2中定义好的
  5. 字体大小,0.5是经过尝试,比较合适的值
  6. 颜色,rgb的分量值,黑色,所以是(0,0,0)
  7. 字宽,这里给一个像素。你也可以自己改变观察效果。

这样其实就得到了我们需要的图片(程序中的矩阵),就像我们之前获得心型的图片一样。接下来就是把黑色(像素值为0)变成一个表情,白色(像素值为1)变成另一个表情,代码是一样的:

# 空字符串,用于保存要发送的内容

输出之后,直接复制就好啦。【为了手机党的方便,你可以翻到本文最后,我有分享几个生成好的,点赞之后,直接复制,就可以啦~

4. 进进阶,任意图片的转换

如果你看到了好玩的图片,也想利用微信表情这样表达的话。这里提供一个思路。

# 提高代码的复用性,可以写个函数 (参考之前的文章哦)

这个的效果就不太好了。因为微信一行只有12个表情啊,精度太低。

c233ebd22180c4ccf43d6c14922ac0a4.png

eae881f17ff69025a03b5f11f8ba1361.png

5. 文末福利:

可以直接复制哦,要用手机看,电脑端不行哦!

【1】LOVE

/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱

/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱

/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱

/拥抱/拥抱/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/玫瑰/拥抱/拥抱

dae05664ffe5e9e82daff43965c29e95.png

059234990977ddd64b9eb58ed18d5130.png

【2】爱心:

/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/玫瑰/拥抱/拥抱/拥抱/玫瑰/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/玫瑰/拥抱/玫瑰/拥抱/拥抱/玫瑰/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱/玫瑰/拥抱/拥抱/拥抱/拥抱/拥抱/拥抱

b54cae77117d101a29c89167d4d8037f.png

/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/玫瑰/玫瑰/猪头/猪头/猪头/玫瑰/玫瑰/猪头/猪头/猪头/猪头/玫瑰/猪头/猪头/玫瑰/猪头/玫瑰/猪头/猪头/玫瑰/猪头/猪头/玫瑰/猪头/猪头/猪头/猪头/玫瑰/猪头/猪头/猪头/猪头/玫瑰/猪头/玫瑰/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/玫瑰/猪头/玫瑰/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/玫瑰/猪头/猪头/玫瑰/猪头/猪头/猪头/猪头/猪头/猪头/猪头/玫瑰/猪头/猪头/猪头/猪头/玫瑰/猪头/猪头/猪头/猪头/猪头/玫瑰/猪头/猪头/猪头/猪头/猪头/猪头/玫瑰/猪头/猪头/猪头/玫瑰/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/玫瑰/猪头/玫瑰/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/猪头/玫瑰/猪头/猪头/猪头/猪头/猪头/猪头

f53cbfc08e12fbad44ad84a989b58bd8.png

哇! 写啦好久。 希望认真看的你,能够学到一些东西。

顺手点个赞。是我继续更新的动力!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值