数字图像处理中的角点检测

数字图像处理中的角点检测 tomato 2023-12-14 15:48:49 127

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

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

特征的类型

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

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

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

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

特征检测

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

  • 哈里斯角点检测
  • 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角点检测器善于区分边缘和角点,不会错误地将边缘误认为是角点。即使在图像旋转时,它仍然有效,因为角点结构在旋转时不会改变。虽然它不是完全尺度不变的,但在轻微尺度变化和不同照明条件下表现得相当不错。

该检测器可能在主要尺度变化(例如,同一角点以不同尺寸出现)方面存在困难,并且并非专门设计用于处理照明或透视发生显著变化的情况。它在各种应用中得到应用,如特征提取、图像匹配、运动跟踪和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是考虑角点检测的邻域的大小。
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
tomato
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
tomato
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区