C++ openCV中高斯的拉普拉斯算子,如何找到零交叉点?
openCV中有拉普拉斯函数直接计算双导数。但这并不意味着我会得到正确的边缘?因为在输出中有很多负值。C++ openCV中高斯的拉普拉斯算子,如何找到零交叉点?,c++,opencv,image-processing,computer-vision,C++,Opencv,Image Processing,Computer Vision,openCV中有拉普拉斯函数直接计算双导数。但这并不意味着我会得到正确的边缘?因为在输出中有很多负值。 我通过这个链接,意识到在那之后,我还必须找到零交叉点。我不知道如何找到零交点。有人能帮我吗?当 值等于0,或 两个相邻的值具有相反的符号 如果你有 Laplacian(src, dst, CV_16S); 您只需扫描dst来查找这两种情况这里有一个简单的Python实现: LoG = cv2.Laplacian(src, cv2.CV_16S) minLoG = cv2.morpholo
我通过这个链接,意识到在那之后,我还必须找到零交叉点。我不知道如何找到零交点。有人能帮我吗?当
- 值等于0,或
- 两个相邻的值具有相反的符号
Laplacian(src, dst, CV_16S);
您只需扫描dst来查找这两种情况这里有一个简单的Python实现:
LoG = cv2.Laplacian(src, cv2.CV_16S)
minLoG = cv2.morphologyEx(LoG, cv2.MORPH_ERODE, np.ones((3,3)))
maxLoG = cv2.morphologyEx(LoG, cv2.MORPH_DILATE, np.ones((3,3)))
zeroCross = np.logical_or(np.logical_and(minLoG < 0, LoG > 0), np.logical_and(maxLoG > 0, LoG < 0))
LoG=cv2.Laplacian(src,cv2.cv16s)
minLoG=cv2.morphologyEx(LoG,cv2.Morpho_侵蚀,np.ones((3,3)))
maxLoG=cv2.morphologyEx(LoG,cv2.MORPH_deplate,np.one((3,3)))
zeroCross=np.logical_或(np.logical_和(minLoG<0,LoG>0),np.logical_和(maxLoG>0,LoG<0))
整个想法是腐蚀操作计算每个像素周围邻域的最小值,并放大最大值。因此,在具有负值的像素的周围具有正值或者具有正值的像素的周围具有负值的情况下,定义零交叉
我希望这会有帮助 +1-一个次要的注意事项是,如果您想找到零交叉点所在位置的精确坐标,如果您看到两个相邻值具有相反的符号,则必须进行一些插值。然而,如果你只想找出哪些像素是边缘,那么检测相反的符号就完全可以了。这真是天赐良机!为了改进使用拉普拉斯高斯方法的边缘检测任务,另一个方法是在局部方差较大的区域使用零交叉。