OpenCV图像特征提取

article/2025/8/30 4:20:03

Camera系列文章

传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境;这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等),融合激光点云和图像进行TTC估计。

系列文章目录
1. 摄像头基础及校准
2. Lidar TTC估计
3. Camera TTC估计
4. OpenCV图像特征提取


文章目录

  • Camera系列文章
  • 前言
  • 一、预备知识
  • 二、强度梯度和图像过滤- 寻找Keypoints特征点
    • 强度梯度介绍
    • 图像去噪和高斯滤波
    • 强度梯度计算
  • 二、Harris角点检测
    • 1.特征点唯一性的度量
    • 2.Harris角点检测实例
    • 3. NMS non-maxima suppression


前言

后续这几节中我们将讨论如何识别并可靠稳定的跟踪连续帧中的图像特征。主要内容包括:

  1. 强度梯度和图像过滤基础,以及合理描述特征的特性;
  2. 熟悉如何用强度描述有效点,以及Harris检测算法
  3. 定位特征点:了解常用的特征检测算法及其特性,如图片旋转等变换条件,以及实际应用中的其他变换下的鲁棒性。
  4. 使用描述符跟踪连续帧中的特征点,重建车辆运动模型。

本节主要覆盖前两点。


考虑到图像识别知识点很多,在这里只是简单的把关键内容放上。另外,由于图像识别知识储备相对薄弱,如有描述不合理的地方还请指正。OpenCV提供了很多算法库用于检测图像的主要特征(Keypoint Detection),然后提取这些特征(Feature extraction),使其称为图像描述符(descriptor)

一、预备知识

特征定义

我们将图像中的某个特别的区域作为一个特征。特征是图像中有意义的图像区域,该区域具有独特特性或易于识别性。角点和高密度区域是很好的特征,而大量重复的区域或低密度区域则不是很好的特征。边缘可将图像分为两个区域,因此也可作为好的特征。斑点也是有意义的特征。
特征提取
将原始特征转换为一组具有明显物理意义、几何特征(角点,不变量)、纹理(LBP HOG)、统计意义或核的特征;
特征选择
从特征几何中挑选一组最具统计意义的特征,达到降维的目的。通过合适的特征选择可以减少数据存储和输入数据带宽,减少冗余,发现更有意义的潜在变量。由于某些算法在识别和提取某种类型特征的时候有较好的效果,所以输入图像是何种类型特征很重要,有利于选择最合适的特征检测算法。

二、强度梯度和图像过滤- 寻找Keypoints特征点

如前一章所述,摄像头无法直接测距,计算TTS是基于目标物在图像中投影的尺寸比。因此我们需要定位特征点keypoints,比如以下从之前图片提取的图块,存在类似的特征点。
在这里插入图片描述

强度梯度介绍

下图展示的是红线内图像的强度Intensity,强度梯度intensity gradient,可以看到,在特征点(边,角等)处存在明显的梯度变化。

Intensity profile of image pixels along the red line
下面我们看一下梯度的计算公式。
Intensity profile of image pixels along the red line

Intensity gradient for three patches and partial derivatives
Equations for gradient direction and magnitude

Equations for gradient direction and magnitude.

通常直接通过相邻像素点的强度差计算强度梯度(Intensity Gradient)会受到图像噪点(如白噪声等)的影响,尤其是低照度环境下,因此我们需要对图像进行滤波,比如高斯滤波,对图像进行去噪,再进行梯度计算。

图像去噪和高斯滤波

为了消除噪声的影响,需要使用平滑算子对图像进行滤波。通常用的是高斯滤波器,使用高斯内核对图像进行处理(核是一组权重,通过相邻像素点来计算当前像素点的像素值;偏差 σ \sigma σ 代表权重分布,偏差越大,周围像素点的权重越大;核大小表示使用多少周围像素点来进行平滑过滤)。

下图是不同偏差的高斯滤波器内核。
在这里插入图片描述
下图是滤波计算公式,通过周围像素点的像素值及权重重新计算像素值。 k ( i , j ) k(i,j) k(i,j)为该像素点的权重, a i a_i ai a j a_j aj为计算点在像素中的坐标。
在这里插入图片描述
下图是7×7内核的示例。A sample Gaussian matrix
以下代码展示高斯滤波如何操作。加载图片后首先生成自定义的高斯内核,再使用Filter2D进行过滤。

void gaussianSmoothing1()
{// load image from filecv::Mat img;img = cv::imread("../images/img1gray.png");// create filter kernelfloat gauss_data[25] = {1, 4, 7, 4, 1,4, 16, 26, 16, 4,7, 26, 41, 26, 7,4, 16, 26, 16, 4,1, 4, 7, 4, 1};cv::Mat kernel = cv::Mat(5, 5, CV_32F, gauss_data);// STUDENTS NEET TO ENTER THIS CODEfor (int i = 0; i < 25; i++){gauss_data[i] /= 273;}// EOF STUDENT CODE// apply filtercv::Mat result;cv::filter2D(img, result, -1, kernel, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);// show resultstring windowName = "Gaussian Blurring";cv::namedWindow(windowName, 1); // create windowcv::imshow(windowName, result);cv::waitKey(0); // wait for keyboard input before continuing
}

强度梯度计算

对图像进行滤波降噪后,下面我们可以计算图像 x x x y y y方向的强度梯度。比较有名的是Sobel算子和Scharr算子。
以下是Sobel算子 x x x y y y方向的3×3内核。
Sobel operator
以下是对图像进行 x x x方向梯度计算的代码。

    // load image from file to avoid computing the operator on each color channel.cv::Mat img;img = cv::imread("./img1.png");// convert image to grayscalecv::Mat imgGray;cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);// create filter kernelfloat sobel_x[9] = {-1, 0, +1,-2, 0, +2, -1, 0, +1};cv::Mat kernel_x = cv::Mat(3, 3, CV_32F, sobel_x);// apply filtercv::Mat result_x;cv::filter2D(imgGray, result_x, -1, kernel_x, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);// show resultstring windowName = "Sobel operator (x-direction)";cv::namedWindow( windowName, 1 ); // create window cv::imshow(windowName, result_x);cv::waitKey(0); // wait for keyboard input before continuing

得到的梯度图如下,分别为① x x x方向梯度图;② x x x y y y方向梯度图。
Gradient image with S_x filter.
Gradient image with S_x and S_y filter.

二、Harris角点检测

由上一节可知,图像边角点等位置具有较大强度梯度,下面我们将使用这些梯度等信息来定义这些特征点,并介绍最常用的Harris角点检测算法。
Harris角点检测算法的基本原理是通过对比与周围像素点的差异来寻找图像中明显变化的区域,以图像梯度作为输入,输出在x、y方向梯度都比较大的位置点。

1.特征点唯一性的度量

关键点检测的想法是检出图像中可以定位特征点x、y位置的独特结构,如角点。下图是角点的示意图,红色代表在该方向没有独特的特征(梯度为0),绿色代表有独特特征。
在这里插入图片描述
为定位角点,我们需要移动红框W并逐个计算梯度。常用的方法是计算红框内相邻点的平方差,公式如下。
在这里插入图片描述
首先使用泰勒公式展开:
在这里插入图片描述
再代入方差公式。其中H为协方差矩阵。
在这里插入图片描述
以下对协方差矩阵H进行可视化,由此可知,垂直于直线方向梯度变化率最大,对应长边的特征向量。沿着直线方向梯度变化率最小,对应短边特征向量。因此,为检出检点,需要找出H的特征向量极大值。
在这里插入图片描述
协方差矩阵H的特征向量计算公式如下:
在这里插入图片描述
Harris角点检测算法中,也使用了高斯窗 w ( x , y ) w(x,y) w(x,y)设置权重计算强度梯度。
在这里插入图片描述

2.Harris角点检测实例

Harris角点检测主要基于以下公式计算每个像素点位置的角点响应值。k因子通常取值为0.04 - 0.06。
在这里插入图片描述

以下例子使用cornerHarrisl来识别角点。cornerHarris函数中最重要的参数是apertureSize,限定Sobel算子的核大小,取值范围为3~31间的奇数。

    // load image from filecv::Mat img;img = cv::imread("./img1.png");// convert image to grayscalecv::Mat imgGray; cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);// Detector parametersint blockSize = 2; // for every pixel, a blockSize × blockSize neighborhood is consideredint apertureSize = 3; // aperture parameter for Sobel operator (must be odd)int minResponse = 100; // minimum value for a corner in the 8bit scaled response matrixdouble k = 0.04; // Harris parameter (see equation for details)// Detect Harris corners and normalize outputcv::Mat dst, dst_norm, dst_norm_scaled;dst = cv::Mat::zeros(imgGray.size(), CV_32FC1 );cv::cornerHarris( imgGray, dst, blockSize, apertureSize, k, cv::BORDER_DEFAULT ); cv::normalize( dst, dst_norm, 0, 255, cv::NORM_MINMAX, CV_32FC1, cv::Mat() );cv::convertScaleAbs( dst_norm, dst_norm_scaled );// visualize resultsstring windowName = "Harris Corner Detector Response Matrix";cv::namedWindow( windowName, 4 );cv::imshow( windowName, dst_norm_scaled );cv::waitKey(0);

输出图像如下,像素点位置越亮,Harris角点响应越高。
在这里插入图片描述

3. NMS non-maxima suppression

以上根据Harris角点检测我们获取了一系列的亮点。考虑到角点附近局部区域可能存在的亮点,要定位角点,还需要使用NMS非最大抑制提取角点,选出局部区域最亮的点作为角点。
代码如下(示例):

void cornernessHarris()
{// load image from filecv::Mat img;img = cv::imread("../images/img1.png");cv::cvtColor(img, img, cv::COLOR_BGR2GRAY); // convert to grayscale// Detector parametersint blockSize = 2;     // for every pixel, a blockSize × blockSize neighborhood is consideredint apertureSize = 3;  // aperture parameter for Sobel operator (must be odd)int minResponse = 100; // minimum value for a corner in the 8bit scaled response matrixdouble k = 0.04;       // Harris parameter (see equation for details)// Detect Harris corners and normalize outputcv::Mat dst, dst_norm, dst_norm_scaled;dst = cv::Mat::zeros(img.size(), CV_32FC1);cv::cornerHarris(img, dst, blockSize, apertureSize, k, cv::BORDER_DEFAULT);cv::normalize(dst, dst_norm, 0, 255, cv::NORM_MINMAX, CV_32FC1, cv::Mat());cv::convertScaleAbs(dst_norm, dst_norm_scaled);// visualize resultsstring windowName = "Harris Corner Detector Response Matrix";cv::namedWindow(windowName, 4);cv::imshow(windowName, dst_norm_scaled);cv::waitKey(0);// STUDENTS NEET TO ENTER THIS CODE (C3.2 Atom 4)// Look for prominent corners and instantiate keypointsvector<cv::KeyPoint> keypoints;double maxOverlap = 0.0; // max. permissible overlap between two features in %, used during non-maxima suppressionfor (size_t j = 0; j < dst_norm.rows; j++){for (size_t i = 0; i < dst_norm.cols; i++){int response = (int)dst_norm.at<float>(j, i);if (response > minResponse){ // only store points above a thresholdcv::KeyPoint newKeyPoint;newKeyPoint.pt = cv::Point2f(i, j);newKeyPoint.size = 2 * apertureSize;newKeyPoint.response = response;// perform non-maximum suppression (NMS) in local neighbourhood around new key pointbool bOverlap = false;for (auto it = keypoints.begin(); it != keypoints.end(); ++it){double kptOverlap = cv::KeyPoint::overlap(newKeyPoint, *it);if (kptOverlap > maxOverlap){bOverlap = true;if (newKeyPoint.response > (*it).response){                      // if overlap is >t AND response is higher for new kpt*it = newKeyPoint; // replace old key point with new onebreak;             // quit loop over keypoints}}}if (!bOverlap){                                     // only add new key point if no overlap has been found in previous NMSkeypoints.push_back(newKeyPoint); // store new keypoint in dynamic list}}} // eof loop over cols}     // eof loop over rows// visualize keypointswindowName = "Harris Corner Detection Results";cv::namedWindow(windowName, 5);cv::Mat visImage = dst_norm_scaled.clone();cv::drawKeypoints(dst_norm_scaled, keypoints, visImage, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);cv::imshow(windowName, visImage);cv::waitKey(0);// EOF STUDENT CODE
}
// this function illustrates a very simple non-maximum suppression to extract the strongest corners
// in a local neighborhood around each pixel
cv::Mat PerformNMS(cv::Mat corner_img)
{// define size of sliding windowint sw_size = 7;                  // should be odd so we can center it on a pixel and have symmetry in all directionsint sw_dist = floor(sw_size / 2); // number of pixels to left/right and top/down to investigate// create output imagecv::Mat result_img = cv::Mat::zeros(corner_img.rows, corner_img.cols, CV_8U);// loop over all pixels in the corner imagefor (int r = sw_dist; r < corner_img.rows - sw_dist - 1; r++) // rows{for (int c = sw_dist; c < corner_img.cols - sw_dist - 1; c++) // cols{// loop over all pixels within sliding window around the current pixelunsigned int max_val{0}; // keeps track of strongest responsefor (int rs = r - sw_dist; rs <= r + sw_dist; rs++){for (int cs = c - sw_dist; cs <= c + sw_dist; cs++){// check wether max_val needs to be updatedunsigned int new_val = corner_img.at<unsigned int>(rs, cs);max_val = max_val < new_val ? new_val : max_val;}}// check wether current pixel is local maximumif (corner_img.at<unsigned int>(r, c) == max_val)result_img.at<unsigned int>(r, c) = max_val;}}// visualize resultsstd::string windowName = "NMS Result Image";cv::namedWindow(windowName, 5);cv::imshow(windowName, result_img);cv::waitKey(0);return result_img;
}

http://chatgpt.dhexx.cn/article/pVGsCcHc.shtml

相关文章

(八)特征选择与特征提取

特征选择与特征提取 一、特征的选择 1、原始特征 在描述对象的时候 模式识别中把每个对象都量化为一组特征来描述&#xff0c;构建特征空间是解决模式识别问题的第一步&#xff0c;其中通过直接测量得到的特征称为原始特征。 如&#xff1a; - 人体的各种生理指标&#xff0…

机器学习之特征提取

机器学习之特征提取 1.为什么要特征提取 原始数据常常是高维的&#xff0c;其中包含了许多冗余信息或者十分稀疏或者计算量大&#xff0c;拿原始数据来训练可行&#xff0c;但是往往直接训练是低效的。所以特征提取往往是必要的。 注&#xff1a;特征提取主要是为了解决下面三…

【机器学习】特征提取

特征提取 目标 应用DictVectorizer实现对类别特征进行数值化、离散化 应用CountVectorizer实现对文本特征进行数值化 应用TfidfVectorizer实现对文本特征进行数值化 说出两种文本特征提取的方式区别 定义 特征提取是将任意数据&#xff08;如文本或图像&#xff09;转换…

特征选择与特征抽取

特征抽取和特征选择是DimensionalityReduction&#xff08;降维&#xff09;两种方法&#xff0c;但是这两个有相同点&#xff0c;也有不同点之处&#xff1a; 1. 概念&#xff1a; 特征抽取&#xff08;Feature Extraction&#xff09;:Creatting a subset of new features by…

【特征提取】基于深度学习的特征提取和匹配方法介绍

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自 | AI深度学习视线精彩内容 计算机视觉需要图像预处理&#xff0c;比如特征提取&#xff0c;包括特征点&#xff0c;边缘和轮廓之类。以前做跟踪和3-D重建&#…

特征工程之特征提取

![ 什么是特征提取呢&#xff1f; 1 特征提取 1 将任意数据&#xff08;如文本或图像&#xff09;转换为可用于机器学习的数字特征 注&#xff1a;特征值化是为了计算机更好的去理解数据 字典特征提取(特征离散化) 文本特征提取 图像特征提取&#xff08;深度学习将介绍&…

数据分析 | 特征提取

目录 特征提取 1 方差过滤&#xff08;VarianceThreshold&#xff09; 2 卡方过滤&#xff08;chi2&#xff1b;SelectKBest&#xff09; 3 F检验&#xff08;f_classif&#xff1b;SelectKBest&#xff09; 关注我【生物海洋计算机支线】&#xff0c;获得更多生物海洋学&…

特征提取的方法

机器学习系列&#xff1a;(三)特征提取与处理 特征提取与处理 上一章案例中的解释变量都是数值&#xff0c;比如匹萨的直接。而很多机器学习问题需要研究的对象可能是分类变量、文字甚至图像。本章&#xff0c;我们介绍提取这些变量特征的方法。这些技术是数据处理的前提——序…

图像特征提取(VGG和Resnet特征提取卷积过程详解)

图像特征提取&#xff08;VGG和Resnet算法卷积过程详解&#xff09; 第一章 图像特征提取认知 1.1常见算法原理和性能 众所周知&#xff0c;计算机不认识图像,只认识数字。为了使计算机能够“理解”图像&#xff0c;从而具有真正意义上的“视觉”&#xff0c;本章我们将研究…

特征提取方法

潜在语义索引 潜在语义索引&#xff08;Latent Semantic Indexing,以下简称LSI&#xff09;&#xff0c;也叫Latent Semantic Analysis ,简称LSA。本文中称为LSI。LSI是一种主题模型&#xff0c;他是利用SVD奇异值分解方法来获得文本的主题的。奇异值分解详见点击打开链接。 …

特征提取方法简介

one-hot 表示一个词 bag-of-words 表示一段文本 tf-idf 用频率的手段来表征词语的重要性 text-rank 借鉴page-rank来表征词语的权重 从基于SVD纯数学分解词文档矩阵的LSA&#xff0c;到pLSA中用概率手段来表征文档形成过程并将词文档矩阵的求解结果赋予概率含义&#xff0c;再到…

特征选择和特征提取(一、概述)

特征选择和特征提取属于图像处理领域最基本的操作。 再这之前&#xff0c;我们先来了解一下卷积和滤波&#xff0c;像平时我们听到的CNN&#xff0c;就是使用卷积操进行图像的滤波操作&#xff0c;简单来说&#xff0c;滤波是图像处理的操作&#xff0c;而卷积是实现滤波的方法…

图像特征及提取

本文主要用于记录图像特征及其提取方法 文章目录 1.颜色特征1.1量化颜色直方图1.2聚类颜色直方图 2.几何特征2.1边缘特征2.2基于特征点的特征描述子2.2.1寻找特征点&#xff1a;Harris角点检测2.2.2另一种特征点&#xff1a;斑点2.2.3SFIT&#xff1a;斑点的特征描述子 1.颜色特…

机器学习中的特征提取

特征提取是将任意数据&#xff08;如文本或图像&#xff09;转换为可用于机器学习的数字特征&#xff0c;特征提取是为了计算机更好的去理解数据。 特征提取大体上可以分为三大类&#xff1a; 字典特征提取(特征离散化)文本特征提取图像特征提取&#xff08;深度学习&#xf…

图像特征提取

从本节开始&#xff0c; 我们将逐步从数字图像处理向图像识别过渡。 严格地说&#xff0c; 图像特征提取属于图像分析的范畴&#xff0c; 是数字图像处理的高级阶段&#xff0c; 同时也是图像识别的开始。 本文主要包括以下内容 常用的基本统计特征&#xff0c; 如周长、面积…

机器视觉中的特征提取【0】:什么是特征提取,特征提取有什么作用?

1.什么是特征提取&#xff1f; 特征提取的英文叫做feature extractor&#xff0c;它是将一些原始的输入的数据维度减少或者将原始的特征进行重新组合以便于后续的使用。简单来说有两个作用&#xff1a;减少数据维度&#xff0c;整理已有的数据特征。 这里我给一个例子来解释特…

c语言结构体学习整理(结构体初始化,结构体指针)

渣渣c的c语言学习之路 1.关于c语言的结构体: 首先我们为什么要用到结构体&#xff0c;我们都已经学了很多int char …等类型还学到了同类型元素构成的数组&#xff0c;以及取上述类型的指针&#xff0c;在一些小应用可以灵活使用&#xff0c;然而&#xff0c;在我们实际应用中…

C语言----初始结构体详解

此文是作者初次学习C语言的时候&#xff0c;写的笔记博文&#xff0c;如有错误请及时指正&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 目录 1&#xff0c;什么是结构体 2. 结构体的声明 2&#xff0c;1结构体声明 2&#xff0c;2结构体成员的类型 2&#xff0c;…

openVAS 介绍

含义及作用&#xff1a; OpenVAS是开放式漏洞评估系统&#xff0c;也可以说它是一个包含着相关工具的网络扫描器。其核心部件是一个服务器&#xff0c;包括一套网络漏洞测试程序&#xff0c;可以检测远程系统和应用程序中的安全问题。 OpenVAS 的功能包括非认证测试、认证测…

040 OpenVAS的下载与安装

文章目录 一&#xff1a;OpenVAS的下载二&#xff1a;OpenVAS的安装2.1&#xff1a;中文版本步骤2.2&#xff1a;英文版本步骤 一&#xff1a;OpenVAS的下载 OpenVAS是开源的网络漏洞扫描器&#xff0c;自从Nessus收费了之后&#xff0c;分支出来的免费的 官网&#xff1a;htt…