正如您在示例图像中看到的,这是SEM捕获的表面图像。我想做的是尽可能准确地检测每个金字塔的峰值。
我试过角点检测方法,结果峰点没有被识别为角点。有没有其他方法适合这样的任务?
params = dict(maxCorners=500,
qualityLevel=0.01,
minDistance=5,
blockSize=10,
useHarrisDetector=False)
corners = cv2.goodFeaturesToTrack(sharp_img, **params)
2条答案
按热度按时间bvjxkvbb1#
方法:模板匹配,使用一个金字塔的尖端补丁。
我通过number of false positives and false negatives, the balance of which can be adjusted判断(目测)结果,并对模板匹配的分数设置阈值。
我使用了几个金字塔尖的平均值,大小为40 x40(“半径”20),但一个模板就足够了。要么用照片编辑器进行裁剪,要么编写代码来选择一些点,收集和平均裁剪。
我试过
fastNlMeansDenoising
。它没有明显的好处。模板匹配已经是一种低通滤波器。我还取消了对整个输入图像的gammaMap。只有
(im * np.float32(1/255)) ** 2.2
。这对结果有明显的好处。我还应用了Sobel/Scharr滤波器。它似乎给予了更好的结果。我将X和Y方向的响应和幅度组成3通道图像进行进一步处理。
给你个建议
您还可以使用
copyMakeBorder
来获取图像边缘附近的提示......由于那里的图像内容较少,因此无论如何您可能都不会在那里获得任何命中。总之,代码的核心是这样的:
现在你需要从中刮取局部最大值。这是非最大值抑制:
centroids
为您提供模板的每个匹配示例的左上角。添加(radius, radius)
以获得模板的中心。剩下的只是画画:
这是结果。我看到至少一个假阳性,和假阴性,但那些金字塔小于补丁半径。
这可以通过在Scharr滤波(梯度)和直接输入(水平)两者上测试模板匹配分数来改进。
bfhwhh0e2#
我尝试了非常简单的方法:
“看起来越靠近金字塔顶部越亮,所以……不能从每个像素位置爬上金字塔吗?”
我用C++实现的非常非常直接(:不是好代码)。
这就是结果。
我不能说这个结果是非常好的,但一些顶部发现。
圆圈越大表示投票越多。