吐血 之前写的居然没存??
(一)
人脸识别分四步:
- 读入图像
- 预处理(高斯滤波)
- 模板匹配
- 获得位置
一定要转成灰度图才能进行操作
先说高斯滤波
-
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。一维零均值高斯函数为: g(x)=exp( -x^2/(2 sigma^2)
-
高斯滤波器是利用高斯核的一个2维的卷积算子,用于图像模糊化(去除细节和噪声)
从数学角度来看,卷积的定义是:函数f(x)与g(x)的卷积写作f*g,定义为两个函数(在f(x)做翻转和平移变换后)乘积的积分,数学形式如下:
[1]
如果我们将积分离散化考虑,得到公式[ 2]
[2]
-
数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。
卷积核就是卷积的模板
1)卷积核的大小一般是奇数,这样的话它是按照中间的像素点中心对称的,所以卷积核一般都是3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。
2)卷积核所有的元素之和一般要等于1,这是为了原始图像的能量(亮度)守恒。其实也有卷积核元素相加不为1的情况,下面就会说到。
3)如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
4)对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。
高斯滤波的实现:
(1)conv2D(m1,m2)逐像素,手写
(2)filter2D
Dst=cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]
(3)dst=cv2.GaussianBlur(src, ksize, sigma1[, dst[, sigma2[, borderType]]])
Src:源图像
Ksize:卷积核尺寸,可取(3,3) (5,5)等
sigma1:x方向标准差
模板匹配:
#cv2提供的模板匹配函数 res = cv.matchTemplate(dst, target, cv.TM_CCOEFF_NORMED) min_val,max_val,min_loc,max_loc = cv.minMaxLoc(res) print(min_loc) green = (255,0, 0) result = cv.rectangle(img,max_loc,min_loc,green)
我的输入图和模板出来结果并不对,不知道哪里错了...
(二)摄像头识别