计算机视觉
基础
Pipeline
- 输入数据(图像)
- 预处理(Noise reduction; color correction; scaling)
- selecting areas of interest(face recognition; image cropping)
- feature extraction(finding facial markers(mouth eyes))
- prediction/recognition(facial expression recognition; emotion prediction)
一个苹果照片信息:color detail; shape detail; lighting conditions; size based on distance
像素(pixel)网格构成图片
像素(0-255),图片原点在左上。
matplotlib.image
读取图像cv2
计算机视觉库opencv%matplotlib qt
使图像交互式窗口弹出
灰度图和彩色图
color threshold
蓝幕,绿幕替换背景
OpenCV将彩色图像读取为BGR(蓝绿红)图像
图片变换时记得np.copy
不会改变原图
- 定义分离颜色的上下限(threshold)
- create a mask
inRange
- 删除蓝幕
- 添加新背景
color spaces
RGB HSV HLS
High-pass filter(高通滤波器)
滤波器
- 过滤掉图像中不需要或无关的信息
- 放大图像的某些特征,如物体边界或其他显著特征
高通滤波器
- 锐化图像
- 强化图像的高频区域(相邻像素强度发生突变的区域)
过滤器:矩阵形式存在,通常称为卷积核
高通滤波器的元素一般和为零,否则计算的结果会带有正负权重
Sobel过滤器可分别检测x和y轴方向的强度突变
竖直过滤器:
|-1, 0, 1|
|-2, 0, 2|
|-1, 0, 1|
cv2.filter2D()
实施核卷积操作
二值图像: 纯粹的黑白图像
cv2.threshold()
设置上下限分离图像
常见的噪声有噪点和模糊的细节,高通过滤器会强化图像里的这些噪声
Low-pass filters(低通滤波器)
低通滤波器是噪声最常见的解决方式
- 模糊图像或使图像平滑起来
- 阻挡特定高频部分
取相邻像素的均值,从而避免强度突变,特别是小范围突变。(均值过滤器)
均值过滤器进行了归一化,确保图像不会变亮或者变暗
高斯模糊
- 能模糊图像
- 又能更好地保存图像边缘的过滤器
计算机视觉中最常见的低通过滤器
低通过滤器其实就是加权平均法,赋予中心像素最大的权重。周围的像素权重多少主要取决于有多接近中心像素。
cv2.GaussianBlur()
执行高斯模糊
过滤器的维数需要是奇数,才能将图像的每个像素作为核的中心,过滤器越大模糊的范围越大。
edge detection
grayscale —> low-pass filter —> high-pass filter —> binary threshold
canny边缘检测器
- 使用高斯模糊过滤掉噪声
- 使用Sobel过滤器确定图像边缘的强度与方向
- 使用非极大抑制来观察每个检测边缘的强度和方向,选出局部最大像素,从而把最强的边缘绘制成连续的,一个像素宽的细线
使用滞后阈值来分离最佳边缘
- 定义一个高阈值,允许强边缘通过
- 设置一个低阈值,任何低于该阈值的边缘即为若边缘,会被舍弃
- 位于中间的边缘,只有当其与另一个强边缘相连时,才会得到保留
这样,canny通过滞后阈值删除了若边缘,消除了噪声
canny适合检测边界和形状
canny上下限1:2或1:3较合适
cv2.Canny()
进行canny检测
线检测(霍夫变换)
图像空间中: 直线 y=mx+b
霍夫空间中: 参数空间
但是存在斜率不存在问题,所以使用Hesse法线式表示:
r = xcosθ + ysinθ
其中r是原点到直线上最近点的距离,θ是x轴与连接原点和最近点直线之间的夹角。如图1所示。
这个参数(r,θ)平面有时被称为霍夫空间。
多个近似在一条直线上的短小的线段转换到霍夫空间后,变为相交的正弦曲线。
cv2.HoughLineP()
Haar Cascades
Haar特征:
就是梯度测量值,测量时算法会观察某个特定像素区域周围的矩形区域,以某种方式减去这些区域,从而计算像素差。
- edges
- lines
- rectangle patterns
Type of features
- edges(边缘): 高强度梯度区域
- corners(角点): 两个边缘相交的地方
- blobs(斑点): 按特征划分的区域,可能是强度特别高或者特别低的区域,或是具备独特纹理的区域
角点:可重复性最高的特征
corner detections
gradient
magnitude: 梯度强度的度量值
direction: 强度变化的方向
- 许多角点检测器会取一个窗口,并在梯度图像不同区域里上下左右移动这个窗口
- 检查窗口梯度方向和幅度是否有突变
cv2.cornerHarris()
cv2.dilate()
膨胀放大明亮的区域
image Contours
示例中,对一个手掌进行描廓。
首先转换为灰度图,然后用逆二进制阈值,把手显示为白色,生成二值图像。
然后要找出轮廓,cv2.findContours()
,轮廓检索模式(此处使用的是树模式)
绘制轮廓,使用cv2.drawContours()
K均值聚类
Separates an image into segments by clustering data points that have similar traits.
- 随机选择k个中心点
- 把各像素值赋给最近的中心点所在的簇
- 然后K均值会分别取各簇所有RGB值的实际平均数,然后将三个中心点更新为相对应的均值
- 重复这个过程,根据调整后的新中心点,形成新簇,然后再次计算簇均值,更新中心点。直到收敛。
cv2.kmeans()