Datawhale 计算机视觉基础-图像处理(下)

参与Datawhale 计算机视觉基础-图像处理(下)打卡记录

一、Harris特征点检测器-兴趣点检测

6.24
在图像处理领域中,特征点又被称为兴趣点或者角点,它通常具有旋转不变性和光照不变性和视角不变性等优点,是图像的重要特征之一,常被应用到目标匹配、目标跟踪、三维重建等应用中。点特征主要指图像中的明显点,如突出的角点、边缘端点、极值点等等,用于点特征提取的算子称为兴趣点提取(检测)算子. 本节将介绍Harris角点检测.

关于角点的具体描述可以有几种:

  • 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
  • 两条及两条以上边缘的交点;
  • 图像中梯度值和梯度方向的变化速率都很高的点;
  • 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。

Harris角点检测算法原理

算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。

这样就可以将 Harris 角点检测算法分为以下三步:

  • 当窗口(局部区域)同时向 x (水平)和 y(垂直) 两个方向移动时,计算窗口内部的像素值变化量 E ( x , y ) E(x,y) E(x,y)
  • 对于每个窗口,都计算其对应的一个角点响应函数 R R R
  • 然后对该函数进行阈值处理,如果 R > t h r e s h o l d R > threshold R>threshold,表示该窗口对应一个角点特征。

具体做法

像素变换量的评估公式为
在这里插入图片描述
其中矩阵M为:

在这里插入图片描述
其中R为
在这里插入图片描述
其中 d e t ( M ) = λ 1 λ 2 det(M)=\lambda_1\lambda_2 det(M)=λ1λ2是矩阵的行列式, t r a c e ( M ) = λ 1 + λ 2 trace(M)=\lambda_1+\lambda_2 trace(M)=λ1+λ2 是矩阵的迹。
$ λ 1 λ_1 λ1 λ 2 λ_2 λ2是矩阵 M M M的特征值, k k k是一个经验常数,在范围 (0.04, 0.06) 之间。

通过M的两个特征值 λ 1 λ_1 λ1 λ 2 λ_2 λ2的大小对图像点进行分类:

  • 平面::该窗口在平坦区域上滑动,窗口内的灰度值基本不会发生变化,所以 ∣ R ∣ |R| R 值非常小,在水平和竖直方向的变化量均较小,即 I x I_x Ix I y I_y Iy都较小,那么 λ 1 λ_1 λ1 λ 2 λ_2 λ2 都较小;
  • 边缘: ∣ R ∣ |R| R值为负数,仅在水平或竖直方向有较大的变化量,即 I x I_x Ix I y I_y Iy只有一个较大,也就是 λ 1 λ_1 λ1>> λ 2 λ_2 λ2 λ 2 λ_2 λ2>> λ 1 λ_1 λ1
  • 角点:[公式] 值很大,在水平、竖直两个方向上变化均较大的点,即 I x I_x Ix I y I_y Iy 都较大,也就是 λ 1 λ_1 λ1 λ 2 λ_2 λ2都很大。

因此,最后的做法就是求出R的值
• 角点:R 为大数值正数
• 边缘:R 为大数值负数
• 平坦区:R 为小数值
在判断角点的时候,–对角点响应函数R进行阈值处理:R > threshold,提取R的局部极大值。

代码示例

# _*_ coding: utf-8 _*_
import cv2
from matplotlib import pyplot as plt
import numpy as np

# detector parameters
block_size = 3
sobel_size = 3
k = 0.06

image = cv2.imread('C:/Users/kwong/Pictures/girl.jpg')
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# modify the data type setting to 32-bit floating point
gray_img = np.float32(gray_img)

# detect the corners with appropriate values as input parameters
corners_img = cv2.cornerHarris(gray_img, block_size, sobel_size, k)

# result is dilated for marking the corners, not necessary
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.dilate(corners_img, kernel)

threshold = 0.2 * dst.max()
height, width = dst.shape
for r in range(height):
    for c in range(width):
        pix = dst[r, c]
        if pix > threshold:
            cv2.circle(image, (c, r), 5, (0, 0, 255), 0)

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()
plt.imsave("girl.jpg", image)

result:

Datawhale 计算机视觉基础-图像处理(下)_第1张图片
Datawhale 计算机视觉基础-图像处理(下)_第2张图片

二、LBP特征描述算子-人脸检测

原始的LBP算子定义为在3∗3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于等于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3∗3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。需要注意的是,LBP值是按照顺时针方向组成的二进制数。

基本的 LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。

等价模式:当某个局部二进制模式所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该局部二进制模式所对应的二进制就称为一个等价模式。

  比如:00000000,11111111,11110010,10111111都是等价模式。

  检查某种模式是否是等价模式:
U ( G p ) = ∣ s ( g p − 1 − g c ) − s ( g 0 − g c ) ∣ + ∑ p = 1 P − 1 ∣ s ( g p − g c ) − s ( g P − 1 − g c ) ∣ U\left(G_{p}\right)=\left|s\left(g_{p_{-1}}-g_{c}\right)-s\left(g_{0}-g_{c}\right)\right|+\sum_{p=1}^{P_{-1}}\left|s\left(g_{p}-g_{c}\right)-s\left(g_{P-1}-g_{c}\right)\right| U(Gp)=s(gp1gc)s(g0gc)+p=1P1s(gpgc)s(gP1gc)
将其和其移动一位后的二进制模式按位相减。并绝对值求和。若U ( G p ) \left(G_{p}\right) (Gp) 小于等于2,则为等价模式。

haarcascade*.xml文件的下载方式
打开https://github.com/opencv/opencv/tree/master/data, 找到对应文件, 然后找到raw, 右键另存为
实践代码

import cv2

face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier("haarcascade_eye_tree_eyeglasses.xml")

img = cv2.imread("C:/Users/kwong/Pictures/boy.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE)

if len(faces) > 0:
    for faceRect in faces:
        x, y, w, h = faceRect
        cv2.circle(img, center=(x + w//2, y + h//2), radius=w//2, color=[255, 0, 0], thickness=2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = img[y:y + h, x:x + w]
        eyes = eye_cascade.detectMultiScale(roi_gray, 1.1, 1, cv2.CASCADE_SCALE_IMAGE, (2, 2))
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 0, 255), 2)

cv2.imshow("img", img)
cv2.waitKey(0)

结果
Datawhale 计算机视觉基础-图像处理(下)_第3张图片
Datawhale 计算机视觉基础-图像处理(下)_第4张图片

你可能感兴趣的:(Datawhale 计算机视觉基础-图像处理(下))