python特效实战—数字成图把小悟空怎么变成你不敢摸的样子
Posted autofelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python特效实战—数字成图把小悟空怎么变成你不敢摸的样子相关的知识,希望对你有一定的参考价值。
〝 古人学问遗无力,少壮功夫老始成 〞
博主准备开一个python特效实战一百例栏目,欢迎大家订阅学习,该专栏的源码每更新一篇博文都同步上传到博主的个人github仓库和微信公众号上面,欢迎大家关注
随着处理图片的技术日益发展,数字成图逐渐被人们所知,其实就是将一张色彩斑澜的图片转换成由纯数字组成的图片,视觉效果切换形成强烈的反差,造成巨大的冲击力,完全可以将一个原本可爱的小悟空变成你不敢摸的小霸王
目录
一、图片预览
- 将一张彩色图片使用python处理后变成完全由数字组成的图片
处理前
处理后
细节放大后
二、特效原理
- 其实原理是将图片转为灰白图片后,将图片分成了三块,明、暗、阴影区域
- 明区域使用空白进行填充
- 阴影区域使用横线进行填充
- 暗区域使用数字进行填充,通过对暗区域的像素进行分类,不同像素使用不同数字进行填充即可
三、程序详解
- 图片灰度处理
if type(frame) != np.ndarray:
frame = np.array(frame)
height, width, *_ = frame.shape # 有时返回两个值,有时三个值
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame_array = np.float32(frame_gray.reshape(-1)
- 参数设置
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
flags = cv2.KMEANS_RANDOM_CENTERS
# 得到labels(类别)、centroids(矩心)。
# 如第一行6个像素labels=[0,2,2,1,2,0],则意味着6个像素分别对应着 第1个矩心、第3个矩心、第3、2、3、1个矩心。
compactness, labels, centroids = cv2.kmeans(frame_array, K, None, criteria, 10, flags)
centroids = np.uint8(centroids))
- 获取不同的明暗程度
centroids_index = np.array([centroids_sorted.index(value) for value in centroids])
bright = [abs((3 * i - 2 * K) / (3 * K)) for i in range(1, 1 + K)]
bright_bound = bright.index(np.min(bright))
shadow = [abs((3 * i - K) / (3 * K)) for i in range(1, 1 + K)]
shadow_bound = shadow.index(np.min(shadow))
- 画布填充
canvas = np.zeros((3 * height, 3 * width, 3), np.uint8)
canvas.fill(255) # 创建长宽为原图三倍的白色画布。
# 因为 字体大小为0.45时,每个数字占6*6个像素,而白底画布为原图三倍
# 所以 需要原图中每2*2个像素中挑取一个,在白底画布中由6*6像素大小的数字表示这个像素信息。
y = 8
for rows in labels_picked:
x = 0
for cols in rows:
if cols <= shadow_bound:
cv2.putText(canvas, str(random.randint(2, 9)), (x, y), cv2.FONT_HERSHEY_PLAIN, 0.45, 1)
elif cols <= bright_bound:
cv2.putText(canvas, "-", (x, y), cv2.FONT_HERSHEY_PLAIN, 0.4, 0, 1)
x += 6
y += 6
- 保存图片
cv2.imwrite('result.jpg', canvas)
以上是关于python特效实战—数字成图把小悟空怎么变成你不敢摸的样子的主要内容,如果未能解决你的问题,请参考以下文章