斑点检测

简介

斑点通常是指,与周围有着颜色和灰度差别的区域,

LoG检测

利用高斯拉普拉斯LOG算子检测图像斑点较DoH,Harris和其它点检测方法稳定性更好,抗图像中噪声的能力更强
二维高斯函数 g(x,y,σ)=12πσe(x2+y2)2σ
拉普拉斯变换容易受到噪点影响,因此需要在处理之前,先用高斯模糊,然后再对平滑处理后的图像进行拉普拉斯变化: Δ2[G(x,y)f(x,y)]=[δ2G(x,y)]f(x,y)=LoG(x,y)f(x,y)
上式说明可以先求高斯函数的拉普拉斯算子,然后再处理图像,证明过程如下:
ddt[h(t)f(t)]=ddtf(τ)ddth(tτ)dτ=f(t)ddth(t) ,在求一次到顺序就变回来了;
高斯的拉普拉斯变换为: Δ2g=2gx2+2gy2 ,高斯函数二阶导数随方差增大呈阶梯衰减现象。所以,为了去除方差导致的衰减现象,应用高斯函数的导数时,对其要进行规范化处理,规范化的高斯拉普拉斯变换为:
Δ2normg=σ2(2gx2+2gy2)=σ2Δ2g
Δ2normg 的极值点,等价于求取下式: (Δ2normg)σ=0
(x2+y22σ2)ex2+y22σ2
r22σ2=0
将拉普拉斯响应到达峰值的尺度 σ 值,成为特征尺度,同时在空间和尺度上的最大值和最小值的点就是我们所期待的斑点,对于二维图像 I(x,y) ,计算图像在不同尺度下的离散拉普拉斯响应值,然后,检查位置空间中每个点。如果该点的拉普拉斯响应值都大于或小于其他26个立方空间邻域的值,那么该点就是被检测到的图像斑点。

OpenCV提供了多种斑点检测算法,其中包括SimpleBlobDetector、MSER(Maximally Stable Extremal Regions)、SIFT(Scale-Invariant Feature Transform)等。这里以SimpleBlobDetector为例,介绍一下OpenCV中如何实现斑点检测。 1. 首先,需要导入OpenCV库并读入待检测的图像,可以使用cv::imread()函数来读入图像。 ``` #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("test.png", IMREAD_GRAYSCALE); if (image.empty()) { std::cout << "Failed to read image." << std::endl; return -1; } // 进行斑点检测 // ... return 0; } ``` 2. 创建SimpleBlobDetector对象,并设置一些参数,如阈值、最小面积、最大面积等。 ``` SimpleBlobDetector::Params params; params.minThreshold = 10; params.maxThreshold = 200; params.filterByArea = true; params.minArea = 100; params.maxArea = 10000; Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params); ``` 3. 使用detector->detect()函数进行斑点检测,该函数返回一个vector类型的数据,其中包含了所有被检测到的斑点的坐标。 ``` std::vector<KeyPoint> keypoints; detector->detect(image, keypoints); ``` 4. 可以使用cv::drawKeypoints()函数将检测到的斑点绘制到图像上。 ``` Mat result; drawKeypoints(image, keypoints, result, Scalar(0,0,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS); imshow("Result", result); waitKey(0); ``` 这样就完成了斑点检测的过程,可以通过调整参数来适应不同的图像和应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值