计算机视觉 Project 2:图像滤波与人像美颜

计算机视觉 Project 2:Image Filtering and Facial Beautification

实验原理

1. OpenCV

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上。

2. 均值滤波

均值滤波是一种典型的线性滤波器,将一个窗口区域中的像素计算平均值,然后将窗口中计算得到的均值设置为锚点上的像素值。均值滤波用卷积实现,得到的像素值需除以窗口尺寸大小。此次实验中的卷积模板如下:

在这里插入图片描述

均值滤波的特点是核中区域贡献率相同。对于椒盐噪声的滤除效果比较好。

实验目的

采用局部、全局图像滤波方法,设计能实现人像美颜功能的算法。

实验内容

  1. 了解并学习OpenCV的Python第三方库——opencv-python中实现读取图像、图像缩放、图像滤波、显示图像、保存图像等功能的函数。
  2. 编写算法,对所给图像进行均值滤波,改变kernel的大小,得到不同的美颜图片,并进行比较。

实验步骤

编写实现人像美颜的Python算法,代码run.py如下所示:

import cv2
import numpy as np

step = 5
# 图片大一点,此处尺寸大一点
kernel = (64, 64)
# cv2.imread() 方法读取图片,读入默认是uint8格式的numpy array
image = cv2.imread("proj2.png")
image = image / 255.0
# image.shape[0]: 图片高
# image.shape[1]: 图片长
# image_size = (图片高, 图片长)
image_size = image.shape[:2]
# round() 方法返回浮点数x的四舍五入值
source_size = (int(round(image_size[1] * step)), int(round(image_size[0] * step)))
target_size = (int(round(kernel[0] * step)), int(round(kernel[0] * step)))
# cv2.resize() 方法对图片进行缩放,插值方法: 双线性插值(默认设置)
sI = cv2.resize(image, source_size, interpolation=cv2.INTER_LINEAR)
sp = cv2.resize(image, source_size, interpolation=cv2.INTER_LINEAR)
# cv2.blur() 方法对图像进行均值滤波
msI = cv2.blur(sI, target_size)
msp = cv2.blur(sp, target_size)
msII = cv2.blur(sI * sI, target_size)
msIp = cv2.blur(sI * sp, target_size)
vsI = msII - msI * msI
csIp = msIp - msI * msp
recA = csIp / (vsI + 0.01)
recB = msp - recA * msI
mA = cv2.resize(recA, (image_size[1], image_size[0]), interpolation=cv2.INTER_LINEAR)
mB = cv2.resize(recB, (image_size[1], image_size[0]), interpolation=cv2.INTER_LINEAR)
gf = mA * image + mB
gf = gf * 255
gf[gf > 255] = 255
# astype() 方法进行强制类型转换
final = gf.astype(np.uint8)
# cv2.imshow() 方法可以在窗口中显示图像
cv2.imshow("image", image)
cv2.imshow("final", final)
# cv2.imwrite() 方法用于将图像保存到指定的文件
cv2.imwrite("final.png", final)
# cv2.waitKey() 函数的功能是不断刷新图像, 频率时间为delay
# 设置 waitKey(0) , 则表示程序会无限制的等待用户的按键事件
cv2.waitKey(0)

将要美颜的图片放入与程序同路径的文件夹中,命名为proj2.png。
运行run.py程序,则会显示2个窗口,image窗口显示原图像,final窗口显示美颜后的图像,如下图所示:

在这里插入图片描述

图 1 run.py运行结果

与此同时,美颜后的图像被命名为final.png,保存路径与原图片相同。
改变kernel的大小(分别设置为8,16,32,64),得到不同的美颜图片,图片命名格式为final-kernel.png,如:final-8.png、final-16.png等等。对这些图片进行比较,确定最佳的kernel值。

实验数据及结果分析

原始图像proj2.pmg如图所示:

在这里插入图片描述
图 2 proj2.png

分别将kernel设置为8,16,32,64,运行run.py,生成的4张美颜图片如下所示:

在这里插入图片描述

图3 final-8.png

在这里插入图片描述

图4 final-16.png

在这里插入图片描述

图5 final-32.png

在这里插入图片描述

图6 final-64.png

从以上不同输出结果可以看出,本算法较好地消除了人脸上的椒盐噪声,并让背景的小花颜色更加明艳鲜亮,使得整体画面更加纯净,达到了美颜的效果。
而在4张美颜图片中,美颜效果最好的是final-8.png,对比其他3张图片,final-8.png上人脸的椒盐噪声最少,背景颜色最为明艳鲜亮。

实验结论

均值滤波对于椒盐噪声的滤除效果比较好,可以实现人像美颜的效果。
对图像应用不同的kernel会对美颜效果产生不同的影响。在本次实验中,设置kernel为8的美颜效果最佳,这与原始图片的尺寸有关。故在实现算法时,kernel的大小时应根据原始图片的尺寸来决定。

总结及心得体会

利用opencv-python第三方库中的各种函数,通过均值滤波实现了人像美颜的算法。通过修改算法中kernel的值,得到不同效果的美颜图片,得到了kernel的大小时应根据原始图片的尺寸来决定这一结论。

对本实验过程及方法的改进建议

采用不同的滤波方法重新进行实验,横向比较不同的滤波方法实现的人像美颜的效果。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值