在图像处理的背景下,“特征”可以直观地理解为图像中突出或独特的部分,可以轻松识别并用于表示图像。将特征想象成图像中使其与众不同的“地标”或“焦点”。为了使这更容易理解,考虑一下在现实生活中如何识别熟悉的地方或物体。
想象一下你正在看一张繁忙的城市街道的照片。你首先注意到什么?可能是一座独特形状的建筑物,一块色彩鲜艳的广告牌,或者一个独特的路标。这些元素之所以引人注目,是因为它们在某种程度上与周围环境不同,也许是通过形状、颜色或纹理。在图像处理中,这些就是特征。特征是许多高级图像处理任务的构建模块。它们就像算法用来以有意义的方式“理解”和处理图像的线索或关键点。
特征的类型
- 边缘是图像中强度或颜色发生显著变化的地方。想象一下山的轮廓与天空的对比;山与天空相交的边界形成一个边缘。
边缘
- 角点是两条或更多边缘相交的点。它们就像图片框的角落,两边在一个点相交。
角点
- 斑点是图像中在性质上与周围区域不同(如亮度或颜色)的区域。把它们想象成表面上的斑点或瑕疵。它们在需要识别或计数对象的情景中使用,比如在图像中计算苹果的数量。
斑点
- 脊线是图像中强度在多个方向上增加的线,就像波峰或山脊。
脊线
特征检测
图像处理中的特征检测算法就像侦探在复杂场景中寻找重要线索的工具。这些算法被设计为自动检测和识别图像的关键特征,如边缘、角点和特定模式,这对于理解和分析图像至关重要。角点可以被看作是两条边缘的交点,或者是图像中梯度显著变化的点,它代表着多个方向上局部强度变化的高点。
- 哈里斯角点检测
- Shi-Tomasi角点检测
哈里斯角点检测
哈里斯角点检测是图像处理中用于角点检测的基本算法。它标识图像中强度在所有方向上发生显著变化的点。哈里斯角点检测的核心思想是识别图像中强度在任何方向上移动时发生显著变化的区域。其基本观察是在平坦区域(如晴朗的天空)中,强度保持相对恒定,而在边缘沿着一个方向急剧变化,但在垂直方向上变化不大。然而,在角落处,强度在每个方向上都发生变化。
该算法使用了一种数学方法,涉及为图像中的每个像素计算一个矩阵(通常称为哈里斯矩阵)。该矩阵捕捉了该像素周围所有方向上的梯度变化(即强度变化)。
它映射了在X和Y方向上获取的所有梯度。
然后,它将椭圆拟合到分布中。
该算法基于λ值计算响应值。
以下是演示哈里斯角点检测的基本脚本。
import cv2 import numpy as np image = cv2.imread('image.jpeg') if image is None: print("Error loading image") exit() # Convert to grayscale gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Convert to float32 for more precision gray = np.float32(gray) # Apply Harris Corner Detector corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04) # Dilate corner image to enhance corner points corners = cv2.dilate(corners, None) # Threshold to mark the corners on the image threshold = 0.01 * corners.max() image[corners > threshold] = [0, 0, 255] # Display the result cv2.imshow('Harris Corners', image) cv2.waitKey(0) cv2.destroyAllWindows()
cv2.cornerHarris函数是OpenCV中用于基于哈里斯角点检测算法进行图像角点检测的关键函数。该函数分析图像中强度的局部变化,以识别角点。
- src是输入图像。它必须是float32类型的灰度图像。
- blockSize是用于角点检测的考虑的邻域大小。它指定将计算强度局部方差的窗口(即局部区域)的大小。
- ksize是Sobel算子的孔径参数。Sobel算子用于计算哈里斯角点检测算法中的图像梯度(x和y导数)。ksize是用于Sobel算子的内核大小。常见的值为3、5或7。较大的内核大小有助于平滑梯度,但可能降低检测到尖锐角点的准确性。
- k是算法中方程中使用的哈里斯检测器的自由参数。它用于计算响应分数,确定是否将某个区域视为角点。k的值通常较小,通常在0.04到0.06的范围内。可以根据应用程序的具体要求调整确切的值。非常高的值可能导致检测到较少的角点,而非常低的值可能使检测器对噪声过于敏感。
Harris角点检测
Harris角点检测器善于区分边缘和角点,不会错误地将边缘误认为是角点。即使在图像旋转时,它仍然有效,因为角点结构在旋转时不会改变。虽然它不是完全尺度不变的,但在轻微尺度变化和不同照明条件下表现得相当不错。
该检测器可能在主要尺度变化(例如,同一角点以不同尺寸出现)方面存在困难,并且并非专门设计用于处理照明或透视发生显著变化的情况。它在各种应用中得到应用,如特征提取、图像匹配、运动跟踪和3D建模。
Shi-Tomasi角点检测
Shi-Tomasi方法,也被称为Good Features to Track检测器,基于与Harris角点检测器相同的基本原理。然而,它引入了一种不同的评估角点响应的方法。
关键区别在于所使用的角点响应函数。虽然Harris使用基于梯度协方差矩阵的两个特征值的综合分数,Shi-Tomasi方法简化了这一过程,仅考虑其中较小的一个特征值。
Shi-Tomasi方法特别擅长检测更为明显和清晰定义的角点。与Harris方法相比,它在平坦区域或沿边缘检测假角点的倾向较小。
import cv2 import numpy as np image = cv2.imread('07.jpg') if image is None: print("Error loading image") exit() # Convert to grayscale gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Shi-Tomasi corner detection parameters maxCorners = 100 qualityLevel = 0.01 minDistance = 10 corners = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel, minDistance) # Draw corners on the image if corners is not None: corners = np.int0(corners) for i in corners: x, y = i.ravel() cv2.circle(image, (x, y), 3, (0, 255, 0), -1) # Display the result cv2.imshow('Shi-Tomasi Corners', image) cv2.waitKey(0) cv2.destroyAllWindows()
Shi-Tomasi角点检测需要一张灰度图像。cv2.cvtColor将图像从一种颜色空间转换为另一种。cv2.goodFeaturesToTrack是实现Shi-Tomasi角点检测算法的函数。
void cv::goodFeaturesToTrack ( InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask = noArray(), int blockSize = 3, bool useHarrisDetector = false, double k = 0.04 )
- image是要进行角点检测的源图像。
- maxCorners指定要返回的最大角点数。如果将其设置为负数,它将返回所有检测到的角点。
- qualityLevel表征要考虑的角点的最小质量。这是一个相对度量,基于图像中一个角点的最高质量分数。分数是根据Shi-Tomasi方法中的特征值或Harris中的响应函数确定的。
- minDistance指定返回的角点之间的最小欧几里得距离。
- mask是一个可选的二进制掩码,指定在哪里查找角点。
- blockSize是考虑角点检测的邻域的大小。