参与Datawhale 计算机视觉基础-图像处理(下)打卡记录
6.24
在图像处理领域中,特征点又被称为兴趣点或者角点,它通常具有旋转不变性和光照不变性和视角不变性等优点,是图像的重要特征之一,常被应用到目标匹配、目标跟踪、三维重建等应用中。点特征主要指图像中的明显点,如突出的角点、边缘端点、极值点等等,用于点特征提取的算子称为兴趣点提取(检测)算子. 本节将介绍Harris角点检测.
关于角点的具体描述可以有几种:
算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。
这样就可以将 Harris 角点检测算法分为以下三步:
其中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 为大数值负数
• 平坦区: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:
原始的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(gp−1−gc)−s(g0−gc)∣+p=1∑P−1∣s(gp−gc)−s(gP−1−gc)∣
将其和其移动一位后的二进制模式按位相减。并绝对值求和。若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)