python-图片,视频字符转换
步入在正题:
第一次尝试进行图片的处理,可能以后会接触人像识别的方向
Open cv2导入:pip install opencv-python
Ps:以前一直以为那是一个单纯的软件
提供一个关于Python-OpenCV cv2的基本操作:http://www.cnblogs.com/zlel/p/9267629.html
第一个问题的提出(傻傻分不清):
是coding:utf-8还是coding=urf-8呢:
https://www.geek-share.com/detail/2712489499.html
计算机中一张图像的组成:一堆像素点。我们平常说的 1920*1080 之类的分辨率,也就是指这个像素点的多少。我们想做成字符画,也就是考虑如何用不同的字符来表示一个像素。
通常一个像素点由3个0~255的值表示,分别表示红、绿、蓝三种颜色值,值越大表示颜色越深。但字符画是没有颜色的,所以需要将图像转成灰度图。比如深的点就是 @,浅色的点就是 .。
对于一个视频来说,只需要将每一帧都转换后输出,并按照一定的时间间隔清屏、输出下一帧,即可达到我们的需要的效果(很气人那个dos窗口我关不掉,一弹一弹的相当气人,视频清晰度太高,由刘大锤同学提供)。
opencv中的CV_RGB2GRAY与CV_BGR2GRAY在我最初学习opencv时,我是觉得他们两个是没有什么区别的,因为用他们转换出来的灰度图用imshow()显示出来是没有任何区别的。但将他们转换出来的灰度图分别用于HoughCircles()#(了解到是一个用来找圆形的算法)时,只有CV_BGR2GRAY转换出来的图能得出想要的结果。这是因为opencv的颜色空间以BGR为主
ret, frame = cap.read() read函数返回值
第一个参数ret 为True 或者False,代表有没有读取到图片
第二个参数frame表示截取到一帧的图片
图片的在转化:
[code]#coding:utf-8 import cv2 # 替换字符列表 ascii_char = list(r"$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") char_len = len(ascii_char) # 读取图片 frame = cv2.imread("img1.jpg") #展示原图 cv2.imshow("sorce_show", frame) # 转灰度图 img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #展示灰度图 cv2.imshow("gray_show",img_gray) # 缩小图片并调整长宽比 img_resize = cv2.resize(img_gray, (int(img_gray.shape[0] / 5), int(img_gray.shape[1] / 20))) text = '' # 遍历图片中的像素 for row in img_resize: for pixel in row: # 根据像素值,选取对应的字符 text += ascii_char[int(pixel / 256 * char_len)] text += '\n' # 输出生成的字符方阵 print(text)
视频的转化:
[code]# coding: utf-8 import cv2 as cv import os import time # 替换字符列表 ascii_char = list(r"$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") char_len = len(ascii_char) # 加载视频 cap = cv.VideoCapture('02.mp4') while True: # 读取视频每一帧 hasFrame, frame = cap.read() if hasFrame==False: break # 视频长宽 frameWidth = frame.shape[0] frameHeight = frame.shape[1] # 转灰度图 img_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 缩小图片并调整长宽比 img_resize = cv.resize(img_gray, (int(frameWidth / 20), int(frameHeight / 20))) text = '' # 遍历图片中的像素 for row in img_resize: for pixel in row: # 根据像素值,选取对应的字符 text += ascii_char[int(pixel / 256 * char_len)] text += '\n' # 清屏 #os.system('cls') print ("\n "* 100) # 输出生成的字符方阵 print(text) # 适当暂停一下 time.sleep(1)
这是我学习所 7ff7 在的公众号推送,就简单copy一下(当做要点总结吧):
· ascii_char 这个字符序列并不是必须这样,只要大致上满足其中的字符看起来从深到浅即可,字符越多越准确,效果就越好。
· resize 这一步比较重要,因为有的视频分辨率很高,直接一个像素转一个字符的话量太大,所以先缩小图片。另一个原因是字符一般都不是正方形,所以在图片长宽比上要做一定的调整,这样最终效果比较好。(实际中要根据你自己控制台中的字体效果来调整缩放比例)
· ascii_char[int(pixel / 256 * char_len)] 是整个转换的核心,因为一个像素的颜色范围是 0~255,通过 pixel / 256 * char_len 可以将一个像素值对应于字符序列中灰度相当的字符。
· 关于输出,有几个值得注意的点:输出一帧前需要清屏,不同平台命令有区别;时间间隔、控制台的字体大小、缩放比例都要根据实际情况作调整;如果计算时间过长、刷新太慢而屏幕闪烁,可以考虑进一步缩小图片,或者先将所以帧转换完毕后再统一输出
个人观点:关于tkinter,pillow,以及pygame对图片处理的总结:
- tkinter图片格式固定,要求恶心,不提供动态刷新,往往要求在label中添加,图片像素点要求多,不容易掌握。
- Pillow是一个强势的的第三方库,图片格式要求放宽了,比较舒服,图片比对,叠加,切割等方面用处很大。可以算是一个简单的ps软件吧。
- 对于pygame,那就更加舒服了,动态刷新,想怎么动怎么动,需要关注像素点,这是一个不太好的地方。
以上总结全是个人使用的第一感觉,可能由于学艺不精,了解片面。本文待更改。
补充,全新的思路:https://www.geek-share.com/detail/2687008363.html
同样方法的图片对比
- python学习之路-base64 图片字符转换
- python将视频转换为全字符视频
- python实现图片字符转换
- Python Code:图片和视频互相转换
- OpenCV|图片与视频的相互转换(C++&Python)
- python如何将图片转换为字符图片
- 用Python把图片转换为ASCII字符的程序
- 使用python将图片转换为字符图片
- 第一个Python小项目:图片转换成字符图片
- OpenCV|图片与视频的相互转换(C++&Python)
- python图片转换成视频
- Python将视频转换为全字符视频(含音频)
- 使用Python opencv实现视频与图片的相互转换
- python小项目练习之转换像素图片为字符图
- python实战===图片转换为字符的源码(转)
- python中ascii码和字符的转换
- Python数字与字符之间的相互转换
- python3图片转换二进制存入mysql
- python实现视频转字符