任务
图像处理1:在Windows10系统下,用python,借助os、PIL、operator、matplotlib.pyplot、spicy.ndimage、pylab、numpy等库在jupyter notebook进行图像处理,完成返回图像格式、大小、模式,添加图像标题,修改图像格式,划定区域并剪切、旋转、粘贴,高斯模糊,绘制图像轮廓图、直方图,Sobel算子。
视频处理1:在Windows10系统下,用python,借助cv2、subprocess等库在jupyter notebook进行视频转图像处理,并使用ffmpeg和ffplay进行图像转视频和播放,以及电脑录屏。
目录
Ⅰ一些常识及os库的常用使用
写程序第一步先确定当前工作路径,发现不对可以更换至需要位置,但工作路径更换与文件路径无关,后续读入图片、视频等的路径宜与当前工作路径相同,而非文件路径。
import os
print(dir(os))
os.getcwd()#查看当前工作路径
os.chdir()#更换当前工作路径
os.listdir()返回指定路径下的文件和文件夹列表
os.makedirs("./p")#在当前目录下创建文件夹,名字是p
ctrl+/:注释或解注n行代码
全大写的是boject的属性(常量)
object名字太长可在导入库的末尾写上as xxx来起别名,但起了别名,原名就失效了
路径尽量保持较短,同时尽量不出现中文命名,容易报错
Ⅱ返回图像格式、大小、模式,添加图像标题,判断两图是否相同
导入所需各库,打开目标图像,返回图像格式、大小、模式,添加图像标题,并展示图像。
http://dba.cn/book/python3/ChangYongDiSanFangMoKuai/PIL.html(PIL中文使用手册)
https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes(英文版)
from PIL import Image
import matplotlib.pyplot as plt
import operator
im=Image.open("hll.jpg")
print(im.format,im.size,im.mode)
plt.imshow(im)
plt.title("Image")
plt.axis("off")
plt.show()
转换色彩模式,重命名图像标题,展示图像,并比较与原图是否相同。
equal to operation比较两个值是否相同,返回bool值,即True/False
im_gray=im.convert("L")
plt.imshow(im_gray)
plt.title("Image-gray")
plt.axis("off")
plt.show()
out=operator.eq(im,im_gray)
print(out)
完整代码:
from PIL import Image
import matplotlib.pyplot as plt
import operator
im=Image.open("hll.jpg")
print(im.format,im.size,im.mode)
plt.imshow(im)
plt.title("Image")
plt.axis("off")
plt.show()
im_gray=im.convert("L")
plt.imshow(im_gray)
plt.title("Image-gray")
plt.axis("off")
plt.show()
out=operator.eq(im,im_gray)
print(out)
运行结果:


Ⅲ试修改文件格式
os.getcwd()查看当前工作路径
os.listdir()返回指定路径下的文件和文件夹列表
for 循环,将所有文件名(原为list列表)转换为字符串。
print(filename.find(".png"))#返回".png"所在的索引位置,若无则返回-1。
infile[0:isimg]对字符串形式的文件名进行切片处理,区间为左闭右开,0表示索引位置左数第一位
第一个if假设,将含有.png的文件末尾都改成.jpg。
第二个if假设,如果修改后缀后的文件与原文件不同,则进行try尝试。
try尝试,打开原文件并保存新文件;如果不行,就返回cannot convert和原文件名。
#修改文件格式
from PIL import Image
import os
print(os.getcwd())
filelist=os.listdir(os.getcwd())
for infile in filelist:
filename=str(infile)
#print(filename)
isimg=filename.find(".png")
if isimg>=0:
outfile=infile[0:isimg]+".jpg"
print(outfile)
if infile!=outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("cannot convert",infile)
运行结果:

Ⅳ划定图像区域,并进行剪贴、旋转、粘贴
导入所需各库,打开图像。
image.crop(box):按区域剪切,box为(左,上,右,下)矩形框四元组
image.transpose(Image.ROTATE_180)对图像旋转180°
image.paste(img,box)对image图像的box区域内粘贴img内容,img的大小应与box完全相同
from PIL import Image
import matplotlib.pyplot as plt
a=Image.open("hll.jpg")
box=( 140,35,300, 230)
b=a.crop(box)
b=b.transpose(Image.ROTATE_180)
a.paste(b,box)
plt.imshow(a)
plt.axis("off")
plt.show()
运行结果:

Ⅴ对图像进行高斯模糊
导入所需各库,打开图像并进行灰度转换,高斯模糊处理,生成新图像,并展示两张图像。
from numpy import * :和import numpy一样
ndimage即n维图像,scipy.ndimage子模块专用于图像处理
filters.gaussian_filter(input,sigma):input: 输入到函数的是矩阵;sigma:标量或标量序列,就是高斯函数里面的\sigma,这个值越大,滤波之后的图像越模糊;返回值:通过高斯模糊处理,输出和输入形状一样的矩阵
plt.figure():生成新图像
from PIL import Image
from numpy import *
from scipy.ndimage import filters
import matplotlib.pyplot as plt
im=array(Image.open("hll.jpg").convert("L"))
im2=filters.gaussian_filter(im,5)
plt.figure()
plt.imshow(im)
plt.axis("off")
plt.show()
plt.imshow(im2)
plt.axis("off")
plt.show()
运行结果:

Ⅵ绘制图像轮廓、直方图
导入所需各库,读取图像到数组中,新建一个图像,不再使用颜色信息,在原点的左上角显示轮廓图像,将横轴纵轴的定标系数设定为相同值,关闭坐标轴标签,生成新图像,绘制直方图,显示这两张图像。
pylab 是一个方便模块,可在单个名称空间中批量导入 matplotlib.pyplot(用于绘图)和 numpy(用于数学和处理阵列)
matplotlib.pyplot.contour()绘制等高线轮廓图
axis square刻度范围不一定一样,但是一定是方形的。 axis equal刻度是等长的,但不一定是方形的,使在每个方向的数据单位都相同。
hist (a,bin),hist即直方图,a即表示图像的一维数组,bin即图像分为若干个小区间,小区间的数量,直方图的区间数量越多,越精细。hist()仅能识别一维数组,im.flatten(),flatten即扁平化,im.flatten()能将任意数组按照行优先准则转换成一维数组
from PIL import Image
from pylab import *
im=array(Image.open("hll.jpg").convert("L"))
figure()
gray()
contour(im,origin="image")
axis("equal")
axis("off")
figure()
hist(im.flatten(),128)
show()
运行结果:

Ⅶ Sobel算子
matlab.zeros (shape, dtype=float, order='C') :返回来一个给定形状和类型的用0填充的数组;order="C"表示行优先,"F"表示列优先
im.shape:用元组表示数组的形状大小
filters.sobel(src, ddepth, dx, dy):src是需要处理的图像;ddepth是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度; dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。
sqrt()求给定值的平方根
**表示幂运算
导入所需各库,打开并转换为灰度图像,再转换为数组形式,生成与该数组相同形状以0组成的数组,进行sobel运算,生成新图像并展示。
from PIL import Image
from pylab import *
from scipy.ndimage import filters
import matplotlib.pyplot as plt
im=array(Image.open("hll.jpg").convert("L"))
imx=zeros(im.shape)
print(imx)
print(im.shape)
print(type(im.shape))
filters.sobel(im,1,imx)
imy=zeros(im.shape)
filters.sobel(im,0,imy)
magnitude=sqrt(imx**2+imy**2)
plt.figure()
plt.imshow(imx)
运行结果:

Ⅷ将视频每一帧保存成图片
导入所需各库,读取视频文件,获取视频中每一帧图像,并以image+数字的形式按顺序命名图片,并保存在文件夹pic下。
import os
import cv2
import subprocess
v_path="ghz.mp4"
image_save="./pic"
cap=cv2.VideoCapture(v_path)
frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
for i in range(int(frame_count)):
_,img=cap.read()
img=cv2.cvtColor(img,cv2.cv2.COLOR_BGR2GRAY)
cv2.imwrite("./pic/image{}.jpg".format(i),img)
运行结果:

Ⅸ将系列图像生成视频,并播放
下载并将ffmpeg、ffplay两个程序放在工作路径下。

调出cmd命令提示符,输入代码:
ffmpeg -f image2 -i ./pic/image%d.jpg -r 24 output.mp4
运行结果:工作路径下生成一个名为output.mp4的视频。
./pic/image%d.jpg 为图片路径,图片的命名格式为image%d.jpg形式,即:image0 image1 image2 ......
ffmpeg基本格式:ffmpeg -i {输入文件路径} -b:v {输出视频码率} {输出文件路径}
所有的参数都是以键值对的形式指定的。
输入文件参数是“-i”,而参数值是文件路径;
输出视频码率参数是“-b:v”,而参数值是视频的码率值。
但是注意位于最后面的输出文件路径前面不包含参数名称。
调出cmd命令提示符,输入代码:
ffplay output.mp4
运行结果:播放名为output.mp4的视频。
Ⅹ电脑桌面录屏
调出cmd命令提示符,输入代码:
ffmpeg -f gdigrab -i desktop out.mp4
运行结果:捕获当前桌面所有窗口的内容并录制屏幕动态。
保存成out.mpg会特别不清晰。
本文介绍了使用Python在Windows10环境下进行图像和视频处理的方法,涵盖了图像的格式、大小、模式查询,图像操作如剪贴、旋转、高斯模糊,轮廓与直方图绘制,Sobel算子应用,视频帧保存,图像转视频播放以及桌面录屏等技术,涉及PIL、cv2、os、numpy等库。
1万+

被折叠的 条评论
为什么被折叠?



