小白学视觉 | 数字图像处理中的角点检测

本文来源公众号“小白学视觉”,仅用于学术分享,侵权删,干货满满。

原文链接:数字图像处理中的角点检测

图像处理的背景下,“特征”可以直观地理解为图像中突出或独特的部分,可以轻松识别并用于表示图像。将特征想象成图像中使其与众不同的“地标”或“焦点”。为了使这更容易理解,考虑一下在现实生活中如何识别熟悉的地方或物体。

想象一下你正在看一张繁忙的城市街道的照片。你首先注意到什么?可能是一座独特形状的建筑物,一块色彩鲜艳的广告牌,或者一个独特的路标。这些元素之所以引人注目,是因为它们在某种程度上与周围环境不同,也许是通过形状、颜色或纹理。在图像处理中,这些就是特征。特征是许多高级图像处理任务的构建模块。它们就像算法用来以有意义的方式“理解”和处理图像的线索或关键点。

特征的类型

  • 边缘是图像中强度或颜色发生显著变化的地方。想象一下山的轮廓与天空的对比;山与天空相交的边界形成一个边缘。

边缘

  • 角点是两条或更多边缘相交的点。它们就像图片框的角落,两边在一个点相交。

角点

  • 斑点是图像中在性质上与周围区域不同(如亮度或颜色)的区域。把它们想象成表面上的斑点或瑕疵。它们在需要识别或计数对象的情景中使用,比如在图像中计算苹果的数量。

斑点

  • 脊线是图像中强度在多个方向上增加的线,就像波峰或山脊。

脊线

特征检测

图像处理中的特征检测算法就像侦探在复杂场景中寻找重要线索的工具。这些算法被设计为自动检测和识别图像的关键特征,如边缘、角点和特定模式,这对于理解和分析图像至关重要。角点可以被看作是两条边缘的交点,或者是图像中梯度显著变化的点,它代表着多个方向上局部强度变化的高点。

  • 哈里斯角点检测

  • 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是考虑角点检测的邻域的大小。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字图像处理是一门很广泛的学科,学习它需要一定的基础知识和实践经验。以下是一些建议来帮助你学习数字图像处理: 1. 学习基础知识:开始之前,了解数字图像的基础知识是很重要的。学习图像的像素表示、色彩模型、图像采集和处理等基本概念。 2. 学习算法和技术:了解数字图像处理常用的算法和技术,如滤波、边缘检测、图像增强、图像分割等。掌握这些算法和技术可以帮助你理解和解决实际问题。 3. 学习编程技能:数字图像处理通常需要编程来实现算法和处理图像。选择一种编程语言,如Python或MATLAB,并学习如何使用它们来进行图像处理。 4. 实践项目:通过实践项目来巩固所学的知识。尝试处理不同类型的图像,并应用所学的算法和技术。这样可以帮助你理解概念,并提高你的实践能力。 5. 学习相关工具:数字图像处理领域有许多常用的工具和库,如OpenCV、PIL等。学习如何使用这些工具可以提高你的效率和准确性。 6. 阅读相关文献和教材:数字图像处理领域有很多经典的文献和教材,阅读它们可以帮助你深入理解概念和算法。可以参考一些经典的教材,如《数字图像处理》(Digital Image Processing)。 7. 参与学习社区:加入数字图像处理的学习社区,参与讨论和交流。这样可以与其他学习者和专业人士互相学习和分享经验。 记住,数字图像处理是一个不断发展和演进的领域,持续学习和实践是提高自己的关键。祝你学习顺利!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值