APP下载

基于Python与OpenCV的实时图像处理相机

2021-07-08张幼作郭惠婷夏清

数码影像时代 2021年7期
关键词:像素点图像处理高斯

张幼作 郭惠婷 夏清

编者按:该项目通过运用Python开发语言在Pycharm平台上,结合开源的OpenCv图像处理函数库、PySimpleGUI库,对摄像头所实时拍摄的图像画面进行采集处理。该项目可通过摄像头实时动态查看各类图像处理的特点并保存图像,其中利用高斯函数、滤波处理、阈值二值化和Canny边缘提取算法等设置控件按钮功能,为后续自制美颜相机提供了基础,也实现了使用时的方便快捷、简单易操作。

引言

在这个网络交友盛行的时期,越来越多的人会互相交换自拍照片来相互认识,运用各种美图的手机软件。为了解决修图软件来回切换的不方便性和降低像素的可能,我们打造了一个利用电脑自带摄像头,以Python为基础的开发语言,结合OpenCv技术的实时动态可查看各类图像处理效果,并实现拍照功能且可保存图片的程序相机。

项目背景

如今修图软件在日常的使用频率日益增多,数量也是只增不减。使用时很多功能需要切换不同软件,很多功能也用不到,不仅浪费时间并且从一定程度上降低了照片的质量。该项目就在是要让使用者用最短时间拍出可直出的图片,不需要来回切换软件,只需设置自己平时常用的功能,大大提高了效率与照片像素。

主要技术

OpenCv

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,实现图像处理和计算机视觉方面的很多通用算法。应用领域广泛,有人机互动、物体识别、运动跟踪、图像分割、人脸识别、机器人等等。其使用方法也简单易懂,主要是运用Opencv库文件,达到捕捉图像、图像分割和人机交互的目的。

设计GUI

图形用户界面,一般称之为GUI,是实现人机交互的窗口。是程序设计的重要组成部分。用户使用图形界面时可以非常方便、直观地进行操作处理。GUI的特点是:具有人机交互性、美观性以及实用性。

该项目使用的是Python图形界库(PySimpleGUI)。相较于Tkinter、wxPython和PyQt来说PySimpleGUI创建GUI更加的容易,用几行代码就可以构建自定义GUI布局,对于初学者来说足够容易,对于高级用户来说也足够强大。

GUI部分主要由摄像头界面区域和控制按钮区域两部分组成,效果如图1所示。该项目无外接硬件,摄像头为内置摄像头。

高斯滤波函数

高斯滤波是一种线性平滑滤波,主要适用于消除高斯噪声。实质上也是一种信号的滤波器。简单来说滤波器就是一个加了权限系数的窗口,当使用滤波器去处理图像时,就把这个窗口放在图像之上,透过这个窗口来看所得到的图像,达到平滑的效果。

具体操作是:用一个用户指定的模板去扫描图像中的每一个像素点,用模板去确定邻域内像素的加权平均灰度值用来替代模板中心像素点的值,如图2所示。

该项目设置高斯滤波矩阵长、宽都为21,标准差取values[‘blur_slider’],代码如图所示:

if values['blur']:

frame = cv2.GaussianBlur(frame, (21, 21),

values['blur_slider'])

阈值二值化函数

阈值是指一种效应能够产生的最低值或最高值。阈值分很多种类,在该项目中运用的是PS阈值。它是基于照片亮度的一个黑白分界值,默认是50%中性灰,即128。亮度高于128会变白,低于128则变黑。

二值化就是进行图像分割的最简单的技术,可以把灰度图像转换为二值图像。通过设定的一个阈值,把大于阈值的像素全设置为0或者255,小于阈值的像素全设置为了一个灰度,这样就完成了对图像的二值化处理。

该项目使用的是固定阈值法,表示根据阈值类型设置好一个阈值,然后进行二值化。代码部分如图所示:

if values['thresh']:

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)[:, :, 0]

frame = cv2.threshold(frame, values['thresh_slider'], 255, cv2.THRESH_BINARY)[1]

调节对比度

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,相反也一样,差异范围越小代表对比越小。使用高对比度对图像整体像素都有很大的帮助。

本项目设定的范围为0-255,控件默认对比度为128中間值。其中OpenCv通过‘create CLAHE()’和‘apply()’函数来实现。代码如下:

if values['enhance']:

enh_val = values['enhance_slider'] / 40

clahe = cv2.createCLAHE(clipLimit=enh_val, tileGridSize=(8, 8))

lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)

lab[:, :, 0] = clahe.apply(lab[:, :, 0])

frame = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)

Canny边缘检测技术

边缘检测[3]是从图像中提取有用结构信息的一种技术,提取图片的边缘信息是底层数字图像处理的基本任务之一。

本项目使用的是Canny边缘检测算法,这是一种多级边缘检测算法。检测边缘目的就在于当我们需要计算机自动提取底层或高层信息时,边缘可以说是最直观的一种信息了。有多种算法都可进行边缘检测,Canny算法虽然年代久远,但很多边缘检测算法都是在此基础上进行改进的。

Canny边缘检测算法的五个实现步骤:

1.在图像中用高斯来平滑滤波,选用高斯滤波也是因为在众多噪声滤波器中,高斯去除噪声的表现最好。

2.计算梯度强度和方向。(opencv中有封装好的函数,可以求图像中每个像素点的n阶导数)

3.应用非最大抑制技术来消除边误检。这一步需要抑制那些梯度不够大的像素点,只保留最大的梯度,从而达到瘦边的目的,从而得到一个更加精细的边缘。

4.应用双阈值筛选,即设置高阈值与低阈值。(这一步还是去除一部分梯度较小的点,使得边缘更加精细化)

5.用滞后技术跟踪边界。技术原理为当边界像素点位置的幅度值超过高阈值,就保留该像素点;当某一像素点位置的幅度值低于低阈值的话,则剔除该位置的像素点,如图3所示。

轮廓检测算法技术

轮廓检测也是图像处理中经常用到的。该项目中,OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。

总的来说,轮廓检测是物体检测和形状分析识别的有用工具,连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度。呈现效果为红线,原底。代码如下:

if values['contour']:

hue = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

hue = cv2.GaussianBlur(hue, (21, 21), 1)

hue = cv2.inRange(hue, np.array([values['contour_slider'], values['base_slider'], 40]),

np.array([values['contour_slider'] + 30, 255, 220]))

cnts= cv2.findContours(hue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]

cv2.drawContours(frame, cnts, -1, (0, 0, 255), 2)

总结与展望

本文讨论了在Pyhon语言基础上,结合OpenCv库,制作一个无外借硬件的实时拍照相机。用户只要有一定的Opencv知识基础便可自行选择自己喜欢的功能去修改自己的代码相机,方便快捷简约。

虽然该项目在实时应用中满足了实时性处理的需求,但其中还有很多需要改进的地方:

1.没有App界面和快捷方式。如果用户想要打开软件,必须打开编辑器启动相机,不够美观。

2.Canny算法年代久远经典,但运算代价相较于其他边界算法要高,运行在实时图像处理部分有一定困难,更适合有高精度要求的应用。

参考文献:

[1]李杰.基于图像处理的实时虚拟化妆及推荐方法研究[D].大连海事大學,2018.

[2]张壮.基于HLS的智能相机图像处理底层IP核设计与实现[D].南京邮电大学,2019.

[3]李晓磊.基于人类视觉感知的轮廓检测方法[D].陕西师范大学,2014.

[4]王志强.基于霍夫变换的图像轮廓检测方法与优化[J].哈尔滨师范大学自然科学学报,2021,37(03):79-82.

本文受到深圳技师学院校级创客基金项目“现实虚拟-基于数字可视化+物联网的虚拟空间”支持。

作者简介:张幼作(2003—),广东汕尾人,本科在读,主要研究方向为通信网络应用;郭惠婷(1991—),广东梅州人,教师,硕士研究生在读,主要研究方向为物联网技术;夏清(1978—),教师,研究生,高级工程师,主要研究方向为物联网、人工智能,为本文的通讯作者。

猜你喜欢

像素点图像处理高斯
天才数学家——高斯
基于图像处理的机器人精确抓取的设计与实现
机器学习在图像处理中的应用
基于5×5邻域像素点相关性的划痕修复算法
基于canvas的前端数据加密
基于逐像素点深度卷积网络分割模型的上皮和间质组织分割
基于图像处理的定位器坡度计算
有限域上高斯正规基的一个注记
Photo Shop通道在图像处理中的应用