(8-5)图像特征提取:基于LoG、DoG 和DoH 的斑点检测器

8.5  基于LoG、DoG 和DoH 的斑点检测器

斑点检测器是一种常用的图像处理技术,用于检测图像中的离散点、小斑点或孤立的亮暗区域。在斑点检测中,LoG(Laplacian of Gaussian)、DoG(Difference of Gaussian)和DoH(Determinant of Hessian)是常用的滤波器或特征算子。

8.5.1  LoG(Laplacian of Gaussian)

LoG是一种线性滤波器,它是将高斯滤波器应用于图像之后再计算拉普拉斯算子。这个过程可以通过以下步骤实现:

  1. 在不同尺度下应用高斯滤波器,通过改变滤波器的标准差来改变尺度。
  2. 对每个尺度下的滤波结果计算拉普拉斯算子,可以通过二阶导数近似实现。
  3. 在每个尺度上检测局部极值点,即图像中的斑点。
  4. LoG滤波器的优点是可以通过不同的尺度对斑点进行多尺度检测,从而获得不同尺寸的斑点。

当使用Python进行图像处理时,可以使用OpenCV库来实现LoG斑点检测器进行图像特征提取。例如下面是一个使用库OpenCV实现LoG斑点检测器的例子。

实例8-17:使用库OpenCV实现LoG斑点检测器

源码路径:daima\8\log.py

import cv2

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 创建LoG滤波器
log_filter = cv2.Laplacian(image, cv2.CV_64F)

# 检测局部极值点
keypoints = []
threshold = 0.01  # 设定阈值
for i in range(1, log_filter.shape[0]-1):
    for j in range(1, log_filter.shape[1]-1):
        neighbors = log_filter[i-1:i+2, j-1:j+2].flatten()
        max_neighbour = max(neighbors)
        min_neighbour = min(neighbors)
        if log_filter[i, j] > threshold and (log_filter[i, j] > max_neighbour or log_filter[i, j] < min_neighbour):
            keypoints.append(cv2.KeyPoint(j, i, _size=2))  # 将检测到的点添加到关键点列表中

# 在图像上绘制关键点
output_image = cv2.drawKeypoints(image, keypoints, None, color=(0, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 显示结果图像
cv2.imshow('LoG Feature Detection', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,首先读取了一张灰度图像,然后使用cv2.Laplacian函数创建了LoG滤波器。接下来,通过遍历滤波器的每个像素,检测局部极值点,并将其添加到关键点列表中。最后,使用cv2.drawKeypoints函数将关键点绘制在原始图像上,并显示结果图像。注意,阈值的选择会对结果产生影响,您可以根据实际情况进行调整。此外,还可以使用关键点描述算法(如SIFT、SURF等)对检测到的关键点进行进一步描述和匹配。执行效果如图8-7所示。

8-7  执行效果

8.5.2  DoG(Difference of Gaussian)

DoG是一种非线性滤波器,它是通过计算两个不同尺度的高斯滤波器之间的差异来实现的。DoG滤波器的计算过程如下:

  1. 在不同尺度下应用两个高斯滤波器,分别具有不同的标准差。
  2. 对两个滤波结果进行相减得到DoG图像。
  3. 在DoG图像中检测局部极值点,即图像中的斑点。
  4. DoG滤波器的优点是可以通过调整两个高斯滤波器的标准差来控制斑点的尺度。

例如下面是一个Python实现DoG斑点检测器的例子。

实例8-18:实现DoG斑点检测器

源码路径:daima\8\dog.py

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 创建DoG滤波器
sigma1 = 1.0  # 第一个高斯滤波器的标准差
sigma2 = 1.6  # 第二个高斯滤波器的标准差
k = np.sqrt(2)  # 尺度因子
s1 = int(2 * np.ceil(3 * sigma1) + 1)  # 第一个高斯滤波器的大小
s2 = int(2 * np.ceil(3 * sigma2) + 1)  # 第二个高斯滤波器的大小
gaussian1 = cv2.GaussianBlur(image, (s1, s1), sigma1)
gaussian2 = cv2.GaussianBlur(image, (s2, s2), sigma2)
dog_filter = gaussian1 - k * gaussian2

# 检测局部极值点
keypoints = []
threshold = 0.01  # 设定阈值
for i in range(1, dog_filter.shape[0]-1):
    for j in range(1, dog_filter.shape[1]-1):
        neighbors = dog_filter[i-1:i+2, j-1:j+2].flatten()
        max_neighbour = max(neighbors)
        min_neighbour = min(neighbors)
        if dog_filter[i, j] > threshold and (dog_filter[i, j] > max_neighbour or dog_filter[i, j] < min_neighbour):
            keypoints.append(cv2.KeyPoint(j, i, _size=2))  # 将检测到的点添加到关键点列表中

# 在图像上绘制关键点
output_image = cv2.drawKeypoints(image, keypoints, None, color=(0, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 显示结果图像
cv2.imshow('DoG Feature Detection', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,首先读取了一张灰度图像。然后,根据给定的参数(标准差、尺度因子),通过调用cv2.GaussianBlur函数创建了两个不同尺度的高斯滤波器,并对图像进行滤波操作。接下来,计算DoG滤波器,即两个高斯滤波器之间的差异。然后,通过遍历DoG滤波器的每个像素,检测局部极值点,并将其添加到关键点列表中。最后,使用cv2.drawKeypoints函数将关键点绘制在原始图像上,并显示结果图像。与前面的LoG例子类似,可以根据实际情况调整阈值和参数的值,以获得最佳的特征提取结果。同样,您还可以使用关键点描述算法(如SIFT、SURF等)对检测到的关键点进行进一步描述和匹配。执行效果如图8-8所示。

8-8  执行效果

8.5.3  DoH(Determinant of Hessian)

DoH是一种基于Hessian矩阵的特征检测方法,通过计算Hessian矩阵的行列式来检测图像中的斑点。DoH的计算过程如下:

  1. 对图像进行高斯滤波,通过改变滤波器的标准差来改变尺度。
  2. 在每个尺度上计算图像的Hessian矩阵,包括二阶导数的信息。
  3. 计算Hessian矩阵的行列式,并检测行列式的局部极值点,即图像中的斑点。
  4. DoH算法的优点是可以检测不同尺度和不同方向上的斑点。

例如下面是一个使用Python实现DoH斑点检测器的例子。

实例8-19:实现DoH斑点检测器

源码路径:daima\8\doh.py

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 创建DoH滤波器
sigma = 1.0  # 高斯滤波器的标准差
s = int(2 * np.ceil(3 * sigma) + 1)  # 高斯滤波器的大小
gaussian = cv2.GaussianBlur(image, (s, s), sigma)
doh_filter = cv2.Laplacian(gaussian, cv2.CV_64F)

# 检测局部极值点
keypoints = []
threshold = 0.01  # 设定阈值
for i in range(1, doh_filter.shape[0]-1):
    for j in range(1, doh_filter.shape[1]-1):
        neighbors = doh_filter[i-1:i+2, j-1:j+2].flatten()
        max_neighbour = max(neighbors)
        min_neighbour = min(neighbors)
        if doh_filter[i, j] > threshold and (doh_filter[i, j] > max_neighbour or doh_filter[i, j] < min_neighbour):
            keypoints.append(cv2.KeyPoint(j, i, _size=2))  # 将检测到的点添加到关键点列表中

# 在图像上绘制关键点
output_image = cv2.drawKeypoints(image, keypoints, None, color=(0, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 显示结果图像
cv2.imshow('DoH Feature Detection', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,首先读取了一张灰度图像。然后,根据给定的标准差,通过调用cv2.GaussianBlur函数创建了高斯滤波器,并对图像进行滤波操作。接下来,使用cv2.Laplacian函数计算Hessian矩阵的行列式,得到DoH滤波器。然后,通过遍历DoH滤波器的每个像素,检测局部极值点,并将其添加到关键点列表中。最后,使用cv2.drawKeypoints函数将关键点绘制在原始图像上,并显示结果图像。同样地,大家可以根据实际情况调整阈值和参数的值,以获得最佳的特征提取结果。此外,还可以使用关键点描述算法(如SIFT、SURF等)对检测到的关键点进行进一步描述和匹配。执行效果如图8-9所示。

8-9  执行效果

注意:在本节中介绍的斑点检测器,大家在实际应用中可以根据需求选择使用。LoG和DoG通常用于多尺度斑点检测,可以获得不同尺寸的斑点。而DoH则可以更准确地检测具有不同尺度和方向的斑点。根据图像特点和应用需求,选择适合的斑点检测器可以提高检测效果和准确性。

  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值