在一些场合公开他人的照片严格来说是触犯了他人肖像权的,然而有的时候我们需要公开图片,而图片上有一些其他人却无意之间也被公开了。为了避免这种现象,我们学习利用face-recognition和高斯模糊为识别到的人脸打上马赛克
图像模糊本质上就是将(灰度)图像 I 和一个高斯核进行卷积操作:
Iσ = I*Gσ (其中 * 表示卷积操作;Gσ 是标准差为 σ 的二维高斯核)
SciPy 有用来做滤波操作的 scipy.ndimage.filters 模块,该模块使用快速一维分离的方式来计算卷积。可以像下面这样来使用它:
from PIL import Image from numpy import * from scipy.ndimage import filters im = array(Image.open('empire.jpg').convert('L')) im2 = filters.gaussian_filter(im,5)上面 guassian_filter() 函数的最后一个参数表示标准差。
显示了随着 σ 的增加,一幅图像被模糊的程度。σ 越大,处理后的图像细节丢失越多。
如果打算模糊一幅彩色图像,只需简单地对每一个颜色通道进行高斯模糊
选取一张图片进行处理:
import cv2
import os
import face_recognition
from PIL import Image
from numpy import*
from scipy.ndimage import filters
import matplotlib.pyplot as plt
#展示原图
image=plt.imread("D:pythonAds2021girl.jpg")
plt.imshow(image)
plt.axis('off')
plt.show()
#人脸识别
image2=face_recognition.load_image_file("D:pythonAds2021girl.jpg")
face_locations=face_recognition.face_locations(image2)
face_num2=len(face_locations)
org=cv2.imread("D:pythonAds2021girl.jpg")
#获取人脸位置
for i in range(0,face_num2):
top=face_locations[i][0]
right=face_locations[i][1]
bottom=face_locations[i][2]
left=face_locations[i][3]
start=(left,top)
end=(right,bottom)
color=(255,0,0)
thickness=5
img=cv2.rectangle(org,start,end,color,thickness)
plt.imshow(img)
plt.axis('off')
plt.show()
pil = Image.open('D:pythonAds2021girl.jpg')
box = start + end #读取识别到的人脸位置信息
region = pil.crop(box) # 将识别到的人脸区域复制出来
im = array(region) #将图片转换为数组
im2 = zeros(im.shape)
for i in range(3):
im2[:,:,i] = filters.gaussian_filter(im[:,:,i],20) #对每一个颜色通道进行高斯模糊
im2 = uint8(im2)
region = Image.fromarray(im2) #将图像的数据类型转换回去,进行粘贴
pil.paste(region,box)
plt.imshow(pil)
plt.axis('off')
plt.show()
2-学会一个新的ffmpeg的命令,用于视音频处理
参考资料:
ffmpeg 常用命令汇总
ffmpeg使用语法:
命令格式:
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
1、参数选项:
(1) -an: 去掉音频
(2) -acodec: 音频选项, 一般后面加copy表示拷贝
(3) -vcodec:视频选项,一般后面加copy表示拷贝
2、格式:
(1) h264: 表示输出的是h264的视频裸流
(2) mp4: 表示输出的是mp4的视频
(3)mpegts: 表示ts视频流
①把视频的前30帧转换成一个Animated Gif
ffmpeg -i ghz.mp4 -vframes 30 -y -f gif ghz.gif
(test.asf是文件名,30为帧数,-y:表示输出文件若存在则直接覆盖,a.gif为生成的文件名)
下面尝试一下将视频的前30帧转换成gif动图
②我们开始想,如果要从视频中间开始截取应该怎么办呢,于是......
参考:FFmpeg续篇:截取视频片段转成GIF动画
ffmpeg -ss 5 -t 1 -i ghz.mp4 -f gif a.gif
将源文件ghz.mp4,从第5秒的位置开始,截取1秒长度的视频转成GIF文件,保存为a.gif。
-ss:从视频的后面的时间开始截取
-t:指定输出的动图的时长,此处为原始视频的1s
-i:输入原始视频文件
③问题来了,如果源文件是1080P的高清视频,帧率可能还比较高。为了便于网络分享,GIF文件最好小一点。于是,我们需要使用-s参数来进行图像的缩放,使用-r参数来限制目标文件的帧率。命令行如下:
ffmpeg -ss 5 -t 1 -i ghz.mp4 -s 270x480 -f gif -r 1 ghz3.gif3-学会2个图像处理的函数
上节课的帖子链接
2021-10-08 python软件设计 练习4



