Python软件设计基础 第四节-图像处理

目录

一、音视频处理软件ffmpeg

(一)软件介绍

(二)常用工具及命令

1、ffplay

2、ffmpeg主程序

(三)课上案例实操-将多张图片转为视频

1、图片准备,将视频切割为图片

2、运行ffmpeg程序

(四)自学拓展

利用软件为视频添加模糊效果

 二、图片处理-PIL

(一)常用功能

1、为图片添加标题

2、将图片转为灰度图

3、图像模糊处理

4、选取图像局部旋转、粘贴

5、查看直方图

(二)自学函数

1、图像融合

2、调整图片亮度

三、拓展——图像处理与人脸识别结合


一、音视频处理软件ffmpeg

(一)软件介绍

FFmpeg:Fast Forward Moving Picture Experts Group

ffmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含libavcodec(用于多个项目中音频和视频的解码器库),以及libavformat(音频与视频格式转换库)等。

(二)常用工具及命令

1、ffplay

ffplay 是用于播放媒体文件的工具,常用命令有:

ffplay+“同目录下的音视频文件名”
#播放原始音频/视频数据

ffplay -i 视频文件名 -vf setpts=PTS/5
#调整视频的播放速率为五倍

ffplay -i 音频文件名 -af atempo=2
#调整音频的播放速率为两倍

……

2、ffmpeg主程序

常用命令有:

ffmpeg –i input.mp4 –r fps output.mp4
#设置帧率,用 -r 参数设置帧率

ffmpeg -i input_file -s 320x240 output_file
#调整视频分辨率,用-s参数设置视频分辨率,参数值wxh,w宽度单位是像素,h高度单位是像素

ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
#格式转换,i:输入文件;vcodec copy:视频编码处理方式;acodec copy:音频编码处理方式

……

(三)课上案例实操-将多张图片转为视频

1、图片准备,将视频切割为图片

import cv2
import subprocess
#导入第三方库

video_path="ghz.mp4"
#设置视频路径
image_save="./pic"
#设置图片待保存路径,注:需新建名为“pic”的文件夹

cap=cv2.VideoCapture(video_path)
frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
#逐帧裁切视频

for i in range(int(frame_count)):
    _,img=cap.read()
    cv2.imwrite("./pic/image{}.jpg".format(i),img)
    #输出每一帧

此处特别注意,“./pic”为图片的待保存路径,需要自行创建,否则将无法输出图片。

输出结果为:

2、运行ffmpeg程序

首先要将FFmpeg程序与上述pic文件夹放在同一目录下,同时在该目录下运行命令,Windows可尝试在当前文件夹地址栏中输出“cmd”,回车,启动命令提示符。

ffmpeg -f image2 -i ./pic/image%d.jpg -r 24 output.mp4
#将图片转为24帧/秒的视频

 输出结果为:

(四)自学拓展

利用软件为视频添加模糊效果

语法:

boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]

ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
#luma_r和alpha_r半径取值范围是0~min(w,h)/2, chroma_r半径的取值范围是0~min(cw/ch)/2

操作:

ffmpeg  -i  ghz.mp4  -vf  boxblur=1.5:1  out.mp4

运行结果:

 二、图片处理-PIL

(一)常用功能

1、为图片添加标题

原图为:

运行下方代码:

from PIL import Image
import matplotlib.pyplot as plt
#引入第三方库

im=Image.open('cuc.jpg')
#读取图片

plt.imshow(im)
plt.title("Communication University of China")
#添加标题

plt.axis('off')
#关闭坐标轴

plt.show()
#显示

 结果为:

2、将图片转为灰度图

原图如下:

 运行下方代码:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
#导入第三方库

pic=Image.open("ju.jpg").convert("L")
#读取图片,并将图片转化为灰度图

plt.imshow(pic)
plt.title("Girl Picture Processing")
plt.axis("off")
plt.show()
#输出图片

结果为:

3、图像模糊处理

 原图如上

运行下方代码:

from PIL import Image
from scipy.ndimage import filters
import matplotlib.pyplot as plt
import numpy as np
#导入第三方库

pic=np.array(Image.open('ju.jpg'))
pic_fliter=filters.gaussian_filter(pic,5)
#设置图片模糊

plt.figure()
plt.imshow(pic)
plt.axis("off")
#导出原图

plt.figure()
plt.imshow(pic_fliter)
plt.axis("off")
plt.show()
#导出处理后图片

 结果为:

4、选取图像局部旋转、粘贴

原图如上

运行下方代码:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
#导入第三方库

pic=Image.open("ju.jpg")
#读取图片

box=(200,400,350,500)
#截取待放大内容 (横坐标,纵坐标,横坐标,纵坐标)
region=pic.crop(box)
region=region.transpose(Image.ROTATE_180)
#旋转截取内容
pic.paste(region,box)
#粘贴截取内容

plt.imshow(pic)
plt.title("Picture Processing")
#plt.axis("off")
plt.show()
#输出图片

 结果为:

5、查看直方图

运行代码如下:

from PIL import Image
from pylab import *
import matplotlib.pyplot as plt
#引入第三方库

img=array(Image.open('cuc.jpg').convert('L'))
#载入图片并进行灰度处理

hist(img.flatten(),32)
#分析图片直方图

plt.figure("Image")
plt.imshow(img)
plt.axis('off')
plt.show()
#输出图片

结果如下:

(二)自学函数

1、图像融合

 利用PIL中的composite函数,以mask图像为透明度,对给定的两张图像进行融合。变量mask图像的模式可以为“1”,“L”或者“RGBA”。

注:两张图片的尺寸应相同。

代码如下:

from PIL import Image
#引入第三方库

im1 = Image.open("renxiang1.jpg")
im2 = Image.open("renxiang2.jpg")
#载入待处理图片

r,g,b = im1.split()
#分离出r,g,b

print(b.mode)
print(im1.mode,im1.size)
print(im2.mode,im2.size)
#输出相关信息,检验图片尺寸是否一致

im = Image.composite(im1,im2,b)
im.show()
#显示图片

结果为:

2、调整图片亮度

利用PIL中的eval函数,调整图片亮度。具体函数为Image.eval(image,function),其中,变量function对应的函数处理变量image所代表图像中的每一个像素点。如果变量image所代表图像有多个通道,那变量function对应的函数作用于每一个通道。

注:变量function对每个像素只处理一次,所以不能使用随机组件和其他生成器。

代码如下:

from PIL import Image
#导入第三方库

im = Image.open("renxiang2.jpg")
#载入图片

def fun01(x):
    return x*0.5
def fun02(y):
    return y*2.0
#定义function参数

im1_eval = Image.eval(im, fun01)
im2_eval = Image.eval(im, fun02)
#对图像进行处理

im1_eval.show()
im2_eval.show()
#分别输出两种参数下的处理结果

 结果为:

三、拓展——图像处理与人脸识别结合

利用face-recognition对人脸进行数据分析,再使用PIL中的fromarray函数对图片数据实现array到image的转换,并绘制人脸特征。

代码如下:

from PIL import Image, ImageDraw
import face_recognition
#引入第三方库

image = face_recognition.load_image_file("ju1.jpg")
#将jpg文件加载到numpy 数组中

face_landmarks_list = face_recognition.face_landmarks(image)
#查找图像中所有面部的所有面部特征

for face_landmarks in face_landmarks_list:
    #构建特征位置列表
    facial_features = [
        'chin',
        'left_eyebrow',
        'right_eyebrow',
        'nose_bridge',
        'nose_tip',
        'left_eye',
        'right_eye',
        'top_lip',
        'bottom_lip']

    pil_image = Image.fromarray(image)
    #实现array到image的转换
    d = ImageDraw.Draw(pil_image)
    #设置画笔

    for facial_feature in facial_features:
        d.line(face_landmarks[facial_feature], width=5)
        #遍历特征点,并绘制在图片上
        
    pil_image.show()
    #显示图片

结果为:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值