通过Python对图像进行文字画绘制,原理:提取图像轮廓,将轮廓上对应的像素点替换成文字,输出在txt文本中,复制在excel中呈现。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# @Time : 2020/9/11 10:26
# @Author : singweek
# @File : 图像转字符字符转图片.py
import cv2 # 导入OpenCV-Python模块
import random
'''
* 功能:为图片应用写生素描滤镜,并且保存图片到指定路径
* filein:要应用滤镜的图片的路径
* picture_name:要应用滤镜的图片的文件名
'''
def filter(filename):
"""
读取图像并灰度化,输出素描二值化图像
:param filename:
:return:
"""
img_rgb = cv2.imread(filename) # 读取源图片
num_down = 2 # 缩减像素采样的数目
num_bilateral = 9 # 定义双边滤波的数目
# 用高斯金字塔降低取样
img_color = img_rgb
for _ in range(num_down):
img_color = cv2.pyrDown(img_color)
# 重复使用小的双边滤波代替一个大的滤波
for _ in range(num_bilateral):
img_color = cv2.bilateralFilter(img_color, d=4, sigmaColor=8, sigmaSpace=4)
# 升采样图片到原始大小
for _ in range(num_down):
img_color = cv2.pyrUp(img_color)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) # 转换为灰度
img_blur = cv2.medianBlur(img_gray, 19) # 增加模糊效果。值越大越模糊(取奇数)
# 检测到边缘并且增强其效果
img_edge = cv2.adaptiveThreshold(img_blur, 256,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,blockSize=9,C=2)
# img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) # 彩色图像转为灰度图像
return img_edge
def Word_Img(img,strlist,outfile="output.txt",type=2):
"""
:param img: 二维灰度图像
:param strlist: 字符画绘制的字符
:param outfile: 输入文件名
:param type: 占位符,默认汉字2字节
:return:
"""
w, h = img.shape[:]
result = ''
for i in range(w):
for j in range(h):
tmp = random.randint(0, len(strlist)-1)
if img[i][j] < 150:#区分阈值,以便于显示轮廓,可以根据自己的需要设定
result += strlist[tmp]
else:
result += ' '*type
result += '\n'
with open(outfile, 'w',encoding='utf-8') as f:
f.write(result)
# return result
if __name__ == '__main__':
img=filter("test.jpg")
#按照需要进行图像缩放
x, y = img.shape[0:2]
img = cv2.resize(img, (int(y / 2), int(x / 2)))
result=Word_Img(img,['我','爱','你'])