第一次作业——灰度视频处理让其成为伪彩色视频(Linux系统下)
先要安装一个OpenCV,参考于以下链接。
本次作业是处理图像,想要学会如何用代码处理图像就要先学会怎么处理但张的图片,因为视频是由一帧帧的图片合成的。
首先是如何读如图片文件,要使用函数imread(),使用这个函数之前,我们要先引入OpenCV的对象cv2。
import cv2
之后我们就可以使用imread(),基本格式为pciture = cv2.imread(文件地址,flags),中的flags参数可以省略,一般的若flags等于1则读取为彩色图像,若flags等于0则读取为灰度图像。
例子:
imgFile = "../Pictures/image0.jpg" #注意图片名称后面要带图片格式例如jpg,png 。
img2 = cv2.imread(imgFile,flags = 1) #以彩色图像进行读取。
读取图片对图片进行操作之后要保存图片,就需要用到imwrite()函数,
基本格式为cv2.imwrite(保存文件的地址,保存对象)
例子:
saveFile = "../Pictures/images3.jpg"
cv2.imwrite(saveFile, img3)
图片处理之后当然就需要看效果,用到imshow()函数,基本格式为cv2.imshow(以此名称展示图片,展示对象)
例子:
cv2.imshow("Demo1", img3)
个人觉得imshow()跟imwrite()函数在不涉及到循环的情况下,其先后顺序并无讲究,涉及到的情况以后遇到了在进行详细说明。
”读取“,”保存“既然都说明了,那么还差最关键的图片处理部分!
本次作业中我用来处理灰度图像的函数是applyColorMap(),它可以将灰度图像转换成彩色图像
完整的代码如下:
img3 = cv2.applyColorMap(cv2.convertScaleAbs(img2, alpha = 2), cv2.COLORMAP_HOT)
基本格式为:allpyColorMap(文件对象,颜色空间)#一般的颜色空间的index为0-21
颜色空间可参考以下内容
COLORMAP_AUTUMN = 0, //!< ![autumn](pics/colormaps/colorscale_autumn.jpg)
COLORMAP_BONE = 1, //!< ![bone](pics/colormaps/colorscale_bone.jpg)
COLORMAP_JET = 2, //!< ![jet](pics/colormaps/colorscale_jet.jpg)
COLORMAP_WINTER = 3, //!< ![winter](pics/colormaps/colorscale_winter.jpg)
COLORMAP_RAINBOW = 4, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg)
COLORMAP_OCEAN = 5, //!< ![ocean](pics/colormaps/colorscale_ocean.jpg)
COLORMAP_SUMMER = 6, //!< ![summer](pics/colormaps/colorscale_summer.jpg)
COLORMAP_SPRING = 7, //!< ![spring](pics/colormaps/colorscale_spring.jpg)
COLORMAP_COOL = 8, //!< ![cool](pics/colormaps/colorscale_cool.jpg)
COLORMAP_HSV = 9, //!< ![HSV](pics/colormaps/colorscale_hsv.jpg)
COLORMAP_PINK = 10, //!< ![pink](pics/colormaps/colorscale_pink.jpg)
COLORMAP_HOT = 11, //!< ![hot](pics/colormaps/colorscale_hot.jpg)
COLORMAP_PARULA = 12, //!< ![parula](pics/colormaps/colorscale_parula.jpg)
COLORMAP_MAGMA = 13, //!< ![magma](pics/colormaps/colorscale_magma.jpg)
COLORMAP_INFERNO = 14, //!< ![inferno](pics/colormaps/colorscale_inferno.jpg)
COLORMAP_PLASMA = 15, //!< ![plasma](pics/colormaps/colorscale_plasma.jpg)
COLORMAP_VIRIDIS = 16, //!< ![viridis](pics/colormaps/colorscale_viridis.jpg)
COLORMAP_CIVIDIS = 17, //!< ![cividis](pics/colormaps/colorscale_cividis.jpg)
COLORMAP_TWILIGHT = 18, //!< ![twilight](pics/colormaps/colorscale_twilight.jpg)
COLORMAP_TWILIGHT_SHIFTED = 19, //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg)
COLORMAP_TURBO = 20, //!< ![turbo](pics/colormaps/colorscale_turbo.jpg)
COLORMAP_DEEPGREEN = 21 //!< ![deepgreen](pics/colormaps/colorscale_deepgreen.jpg)
可以看到applyColorMap的参数中还有一个cv2.convertScaleAbs函数,这个函数作用大约就是用来调整图片的对比度色差的,其返回值是处理之后的图片,基本格式:convertScaleAbs(图片对象,alpha)其中alpha的数值表示处理的程度,数值越大对比度色差越大。
图片的处理已经完成了 ,现在需要做的就是把读如视频并且把视频分成一帧帧的图片来处理。
读如视频文件用的是VideoCapture()函数,参数是需要读如文件的地址,一般将地址赋予另一个对象,然后传入这个对象。
例子:
video_path = "../Videos/PLANE.mp4"
cap = cv2.VideoCapture(video_path)
读取了视频之后我们需要知道视频有多少帧,需要用到函数cap.get(cv2.CAP_PROP_FRAME_COUNT)函数,此函数参数的相关问题等到以后需要用到相关功能的时候进行总结统一介绍。
frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
获取了视频cap的总帧数frame_count之后需要以此为长度用for循环来处理每一张图片。
for i in range(int(frame_count)):
Result,img = cap.read()
imgs = cv2.applyColorMap(cv2.convertScaleAbs(img, alpha = 2), cv2.COLORMAP_HOT)
cv2.imwrite((image_save+"/image{}.jpg").format(i),imgs)
其中 Result,img = cap.read() ,Result的值为True或者False,表示是否成功截取一帧图片。
img表示截取的那一帧图片对象,是可以直接拿来作为对象使用的。
然后在把这些处理好的图片以统一带顺序的名称命名并且保存,参考与以下语句:
cv2.imwrite((image_save+"/image{}.jpg").format(i),imgs)
其中的这一段如何进行理解?
image_save : "../Demo_Pictures" , 代表的意思是保存文件的路径,“+”表示加上,也就是加上“/image{}.jpg",结果等于"../Demo_Pictures/image{}.jpg",综合imwrite语句表达的意思就是将图片以名称 image{},格式为jpg的方式来存储图片。后面的 .format(i) 的作用是给文件名后面添加一个序号用来在文件夹里面给文件进行排序。
到了这里,python变成的部分也就结束了。
然后我们需要用到下面的语句把处理好的文件合成视频。
ffmpeg -i ../Demo_Pictures/image%d.jpg -pix_fmt yuv420p out.mp4
到了这里本次作业的内容也就完成了。
注:本文章仅用于记录自己学习
参考: