计算机视觉入门(一)

计算机视觉

基础

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边缘检测器

  1. 使用高斯模糊过滤掉噪声
  2. 使用Sobel过滤器确定图像边缘的强度与方向
  3. 使用非极大抑制来观察每个检测边缘的强度和方向,选出局部最大像素,从而把最强的边缘绘制成连续的,一个像素宽的细线
  4. 使用滞后阈值来分离最佳边缘

    • 定义一个高阈值,允许强边缘通过
    • 设置一个低阈值,任何低于该阈值的边缘即为若边缘,会被舍弃
    • 位于中间的边缘,只有当其与另一个强边缘相连时,才会得到保留

    这样,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

  1. edges(边缘): 高强度梯度区域
  2. corners(角点): 两个边缘相交的地方
  3. blobs(斑点): 按特征划分的区域,可能是强度特别高或者特别低的区域,或是具备独特纹理的区域

角点:可重复性最高的特征

corner detections

gradient
magnitude: 梯度强度的度量值
direction: 强度变化的方向

  1. 许多角点检测器会取一个窗口,并在梯度图像不同区域里上下左右移动这个窗口
  2. 检查窗口梯度方向和幅度是否有突变

cv2.cornerHarris()

cv2.dilate()膨胀放大明亮的区域

image Contours

示例中,对一个手掌进行描廓。
首先转换为灰度图,然后用逆二进制阈值,把手显示为白色,生成二值图像。
然后要找出轮廓,cv2.findContours(),轮廓检索模式(此处使用的是树模式)
绘制轮廓,使用cv2.drawContours()

K均值聚类

Separates an image into segments by clustering data points that have similar traits.

  1. 随机选择k个中心点
  2. 把各像素值赋给最近的中心点所在的簇
  3. 然后K均值会分别取各簇所有RGB值的实际平均数,然后将三个中心点更新为相对应的均值
  4. 重复这个过程,根据调整后的新中心点,形成新簇,然后再次计算簇均值,更新中心点。直到收敛。

cv2.kmeans()