用记事本显示人脸图像
前言:
这段时间,抖音上经常出现有”大神“自称花了几天用记事本打字符打出了人脸(或其他照片),一时引起大家的关注。很显然,谁会无聊到花那么长时间弄这个,进而有人提出使用啥啥啥软件,作为一个小程序猿,使用别人的软件也是不可能的,肯定要自己写代码实现啊!
开发语言:
python代码(谁让它那么好用呢)
思路:
使用opencv库读取图片,当然也有其他库可以用,自己喜欢就好。例如下图:
之后我们载处理成灰度图,进行二值化处理,即整个图的所有像素点非黑即白,得到下面的结果:
然后就简单了,先新建一个记事本。
然后遍历这个二值图,发现是黑色的地方,即像素值为0的地方,那么我们在记事本的相应位置写入一个字符(如数字7),发现是白色的地方,即像素值为255的地方,我们写入字符空格。然后就行啦!
代码:
下面贴出整个代码,相应的解释都用注释写出来了,仔细看还是比较简单的
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from cv2 import cv2
import string
import random
# 因为图片有大有小嘛,图片太大的话,当你把记事本的字体设置成最小的时候
# 屏幕都不能去容纳记事本一行的字符。
# 本来图片的第一行对应的字符假如有1000个,那你的电脑屏幕显示记事本内容时
# 一行最多显示500个字符,那这样就导致剩下的500个字符要么还是在第一行
# 但是你得拖动滚动条去看,要么被自动换行放到第二行去了
# 所以我们有必要去知道自己电脑记事本横向和纵向能显示的最多字符数
MAX_WIDTH = 335
MAX_HEIGHT = 98
def handle_image(img_path):
# 读取图片
img = cv2.imread(img_path)
# 将图片转化成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# 将灰度图转化成二值图,像素值超过127的都会被重新赋值成255
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
return binary
def main():
# 得到二值图
img = handle_image(r'2.jpg')
# 这里就是一开始说的图片大小问题,我们直接强制设置图片的大小
img = cv2.resize(img, (334, 98))
height, width = img.shape
# 这里chars = 26小写字母+26大写字母+0到9共10个数字+后面那些标点符号
chars = string.ascii_letters + string.digits + r'~!@#$%^&*()_+{}[]\|><./'
# 转化成列表
chars = list(chars)
# 遍历图像
with open(r'1.txt', 'w', encoding='utf-8') as f:
for row in range(0, height):
for col in range(0, width):
# 像素值为0即黑色,那么随便选个字符去写入到txt文件
if img[row][col] == 0:
ch = random.choice(chars)
f.write(ch)
# 否则写入空格
else:
f.write(' ')
f.write('*\n')
if __name__ == '__main__':
main()
结果:
说明:记得调整记事本字体,我的如下:
然后效果图如下:写入的全是字符7
再放一张:写入的是随便取的字符
后记:
我写的比较简单,只能处理像这种比较简单的图,然后人物都比较突出,背景简单。所以在实验的时候注意选择比较单调的人物图,复杂的效果不好。