首页 > 其他分享 >(8-5)图像特征提取:基于LoG、DoG 和DoH 的斑点检测器

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

时间:2024-03-23 20:31:16浏览次数:21  
标签:滤波器 DoH LoG 斑点 image cv2 DoG filter 图像

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则可以更准确地检测具有不同尺度和方向的斑点。根据图像特点和应用需求,选择适合的斑点检测器可以提高检测效果和准确性。

标签:滤波器,DoH,LoG,斑点,image,cv2,DoG,filter,图像
From: https://blog.csdn.net/asd343442/article/details/136974548

相关文章

  • 使用Log4j2输出日志演示
    pom.xml引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!--去掉SpringBoot默认日志配置-->......
  • verilog模型概述
    模型功能verilog是硬件描述语言的一种,主要用于ASIC和FPGA中,用于实现数字逻辑控制。相较于VHDL,verilog的语法更加接近C语言,格式也更加宽松,具备更强的灵活性。模型框图verilog在FPGA内主要用于描述寄存器行为以及连线关系,也可以通过特定的原语实现特殊硬件的调用,比如BRAM、O......
  • 鸿蒙开发,使用http返回的响应数据无法正常获取 ,利用hilog打印日志一直结果是object或者
    项目场景:这里简述项目相关背景:前后端分离项目,使用鸿蒙做前端,后端SpringBoot写好接口(通过商品分类id查询商品列表),鸿蒙前端页面使用Tabs组件导航,展示商品分类,点击分类标签,查询后端接口,返回对应分类商品列表数据项目场景:鸿蒙开发,使用http返回的响应数据无法正常获取,利用hilo......
  • 【python】(05)如何python中的logging模块记录日志信息
    系列文章回顾【python】(01)初识装饰器Decorator【python】(02)初识迭代器Iterator【python】(03)初识生成器Generator【python】(04)python中实现多任务并发和并行的区别【python】(05)如何python中的logging模块记录日志信息文章目录一.Logging模块的常用组......
  • R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为
    全文链接:https://tecdat.cn/?p=35426原文出处:拓端数据部落公众号本文利用R语言,通过逐步逻辑回归模型帮助客户分析两个实际案例:麻醉剂用量对手术病人移动的影响以及汽车购买行为预测。通过构建模型并解释结果,我们探究了各自变量对因变量的影响程度。同时,借助ROC曲线可视化分析,评......
  • 【Azure Log A workspace】Azure上很多应用日志收集到Log A workspace后如何来分别各
    问题描述AzureLogAnalyticsWorkspace作为Azure云上统一存储日志的服务,可以由多个服务直接发送日志到LogAWorkspace。如ApplicationInsights,AzureDiagnostic Settings等。只是,当数据都收集到同一个Workspace后,如何来分别是那些资源发送的日志呢?分别占用了多少的存储......
  • 2023-12-5-logstash和filebeat使用
    应用场景、组件介绍、logstash启动、filebeat启动应用场景分布式场景中,不同服务器的服务日志集中收集管理,方便排查问题组件介绍logstash日志收集器,将接受到的日志存储到ES中fielbeat日志解析器,将日志解析后通过网络发送给日志收集器logstash启动下载https://www.elastic......
  • HyperLogLog,feo,持久化,RDB
    HyperLogLog基于HyperLogLog算法:极小的空间完成独立数量统计,极小内存实现去重-爬虫去重-黑白名单-垃圾邮件过滤pfaddurls"www.baidu.com""www.cnblogs.com""www.lqz.com"pfcounturlspfaddurls值#返回0表示在,返回1表示不在#总结......
  • Oracle WebLogic Server JNDI注入漏洞(CVE-2024-20931)复现
    先从镜像站拉取OracleWebLogicServerJNDI注入漏洞(CVE-2024-20931)然后在docker中启动这个镜像即可在网页中访问,搭建网站成功使用利用工具来进行验证是否存在漏洞获取DNS查看是否有回显有回显漏洞存在创造反弹shell,先查看攻击机的ip进行反弹shell编码使用nc开启监听端......
  • verilog设计2048游戏及仿真
    设计一个简化版的2048游戏Verilog代码需要考虑以下几个关键方面的设计思路:1.**棋盘设计**:  -使用一个4x4的二维数组表示2048游戏的棋盘,每个位置可以存储一个数字,采用适当的位宽存储游戏中可能出现的数字。  2.**游戏状态设计**:  -使用状态机来管理游戏的各......