计算机系统应用教程网站

网站首页 > 技术文章 正文

opencv 图像特征一文通 opencv图像识别特定形状

btikc 2024-10-08 01:22:16 技术文章 9 ℃ 0 评论

图像特征的定义

图像特征是图像中独特的、易于跟踪和比较的特定模板或特定结构

  • 图像特征提取与匹配是计算机视觉中的一个关键问题,在目标检测、物体识别、三维重建、图像配准、图像理解等具体应用中发挥着重要作用。
  • 图像特征主要有图像的颜色特征、纹理特征、形状特征和空间关系特征

图像特征的分类

1)颜色特征

  • 颜色特征是一种全局特征,描述了图像或图像区域对应的景物的表面性质
  • 颜色特征描述方法:
  • 1)颜色直方图
    • 2)颜色空间
    • 3)颜色分布

2)形状特征

  • 形状特征有两类表示方法,一类是轮廓特征,另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征描述了是图像中的局部形状特征。

3)纹理特征

  • 纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特征,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的

4)空间关系特征

  • 空间关系特征,是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系
  • 这些关系也可分为连接/邻接关系、交叠/重叠关系和包含/独立关系等。

经典特征算法

1)形状特征

1.1)Harris

特点:

  • 角点:在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来定义角点可以有以下两种定义:
    • 角点可以是两个边缘的交点
    • 角点是邻域内具有两个主方向的特征点
  • 角点计算方法:
    • 前者通过图像边缘计算,计算量大,图像局部变化会对结果产生较大的影响
    • 后者基于图像灰度的方法通过计算点的曲率及梯度来检测角点
  • 角点所具有的特征:
    • 轮廓之间的交点
    • 对于同一场景,即使视角发生变化,通常具备稳定性质的特征
    • 该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化
  • 性能较好的角点:
    • 检测出图像中“真实”的角点
    • 准确的定位性能
    • 很高的重复检测率
    • 噪声的鲁棒性
    • 较高的计算效率

实现过程

代码实现:

import cv2
import numpy as np

filename = "harris.jpg"
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)

# 输入图像必须是 float32, 最后一个参数在 0.04 到 0.06 之间
dst = cv2.cornerHarris(gray, 2, 3, 0.03)

# 结果进行膨胀
dst = cv2.dilate(dst, None)

img[dst > 0.01*dst.max()] = [0, 0, 255]
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.cornerHarris() 参数如下:

  • img : 数据类型为 float32 的输入图像
  • blockSize : 角点检测中要考虑的领域大小
  • ksize : Sobel 求导中使用的窗口大小
  • k : Harris 角点检测方程中自由参数,取值参数为 [0.04, 0.06]

1.2)Hog

特点:

  • 方向梯度直方图(Histogram of Oriented Gradient, HOG) 特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。
  • 它通过计算和统计图像局部区域的梯度方向直方图来构成特征。
  • HOG 特征结合 SVM 分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。
  • 主要思想:在一幅图像中,目标的形状能够被梯度或边缘的方向密度分布很好地描述。

实现过程:

  • 灰度化(将图像看做一个 x, y, z (灰度)的三维图像)。
  • 采用 Gamma 校正法对输入图像进行颜色空间的标准化(归一化)。
  • 计算图像每个像素的梯度(包括大小和方向)
  • 将图像划分为小 cells

上步中计算的每个像素点的位置处包含了2个值:强度和方向。由(2)的性质,将方向 0-180 度分成9个区间:0,,20,40,...160,之后统计每个像素点所在的区 间——将这个区间命名为 bin,采取的原则是对每个像素点处的值,按 的比例将分配给相邻的 bin,

  • 统计每个 cell 的梯度直方图(不同梯度的个数),得到 cell 的描述子
  • 将每几个 cell 组成一个 block, 得到 block 的描述子
  • 将图像 image 内的所有 block 的 HOG 特征 descripor 串联起来就可以得到 HOG 特征,该特征向量就是用来目标检测或分类的特征

代码实现:

import cv2
import numpy as np
# 判断矩形 i 是否完全包含在矩形 o 中
def is_inside(o, i):
    ox, oy, ow, oh = o
    ix, iy, iw, ih = i
    return ox > ix and oy > iy and ox + ow < ix + iw and oy + oh < iy + ih
# 对人体绘制颜色框
def draw_person(image, person):
    x, y, w, h = person
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 255), 2)

img = cv2.imread("person.jpg")
hog = cv2.HOGDescriptor() # 启动检测对象
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
found, w = hog.detectMultiScale(img, 0.1, (1,1))

# 丢弃某些完全被其它矩形包含在内的矩形
found_filtered = []
for ri, r in enumerate(found):
    for qi, q in enumerate(found):
        if ri != qi and is_inside(r, q):
            break
        else:
            found_filtered.append(r)
# 对不包含在内的有效矩形进行颜色框定
for person in found_filtered:
    draw_person(img, person)

cv2.imshow("person detection", img)
cv2.waitKey(0)
cv2.destroyAllWidndows()

1.3)SIFT

特点:

  • SIFT, 即尺度不变特征变换算法(Scale-invariant feature transform, SIFT), 是用于图像处理领域的一种算法。SIFT 具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子
  • 其应用范围包含物体辨识,机器人地图感知与导航、影像缝合、3D 模型建立、手势辨识、影像追踪和动作比对。
  • 旋转、缩放、平移不变性
  • 解决图像仿射变换、投影变换的关键的匹配
  • 光照影响小
  • 目标遮挡影响小
  • 噪声景物影响小

实现过程:

  • 尺度空间极值检测点检测
  • 关键点定位:去除一些不好的特征点,保存下来的特征点能够满足稳定性等条件
  • 关键点方向参数:获取关键点所在尺度空间的邻域,然后计算该区域的梯度和方向,根据计算得到的结果创建方向直方图,直方图的峰值为主方向的参数
  • 关键点描述符:每个关键点用一组向量(位置、尺度、方向)将这个关键点描述出来,使其不随光照、视角等等影响而改变
  • 关键点匹配:分别对模板图和实时图建立关键点描述符集合,通过对比关键点描述符来判断两个关键点是否相同

代码实现

import cv2
import numpy as np

img = cv2.imread("harris2.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()

kp = sift.detect(gray, None) # 找到关键点
img = cv2.drawKeypoints(gray, kp, img) # 绘制关键点

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

sift.detect() 函数

  • 返回的关键点是一个带有很多不用属性的特殊结构体,属性当中有坐标、方向、角度等。
  • 使用 sift.compute() 函数来进行计算关键点描述符
    • kp, des = sift.compute(gray, kp)
  • 如果未找到关键点,可使用函数 sift.detectAndCompute() 直接找到关键点并计算
  • 在第二个函数中,kp 为关键点列表, des 为 numpy 的数组, 为关键点数目 x 128

2)纹理特征

2.1)LBP

特点:

  • LBP (Local Binary Pattern, 局部二值模式),是一种用来描述图像局部纹理特征的算子,它具有旋转不变性和灰度不变性等显著的优点
  • LBP 记录的是中心像素点与邻域像素点之间的差值
  • 当光照变化引起像素灰度值同增同减时,LBP 变化并不明显
  • LBP 对与光照变化不敏感, LBP 检测的仅仅是图像的纹理信息

原理:

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表