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特效实战—数字成图把小悟空怎么变成你不敢摸的样子的主要内容,如果未能解决你的问题,请参考以下文章

python特效之数字成像

python特效之数字成像

opencv中16位的矩阵保存成图像,最大灰度值只有32768

python如何把set()变成0

matlab 将数字矩阵转换成图像

Python万年历怎么把表头和数字部分结合