public void FindEdgesOUTCir(Mat srcImage, double edgeThreshold, ref List<Point2f> zeroPList) { // 定义图像边界矩形 Rect boundary = new Rect(0, 0, srcImage.Width, srcImage.Height); // 计算图像中心处的y坐标 float cenY = (boundary.Y + boundary.Height) / 2; // 对输入图像进行竖直方向的投影 Mat projectMat = VerticalLineGrayParallel(srcImage); // 应用Sobel算子,得到x方向上的导数 Mat sobelMat = new Mat(); Cv2.Sobel(projectMat, sobelMat, MatType.CV_32FC1, 1, 0, 1, 1, 0); // 设置阈值 float thresholdFloat = (float)edgeThreshold; int width = sobelMat.Width; var points = new ConcurrentBag<Point2f>(); // thread-safe collection to hold edge points Parallel.For(1, width, i => { float sdx1 = sobelMat.At<float>(0, i - 1); float sdx2 = sobelMat.At<float>(0, i); if (sdx1 < thresholdFloat && sdx2 >= thresholdFloat) { float a = (sdx2 - sdx1) / 1f; float b = sdx1 - a * (i - 1); float x = (thresholdFloat - b) / a; Point2f point = new Point2f(x, cenY); points.Add(point); } }); zeroPList = points.ToList(); // convert thread-safe collection to list } 提升鲁棒性请优化,进一步优化,以适应边沿对比度比较低的图像
时间: 2024-02-10 14:35:04 浏览: 61
OpenCV实现创建包围轮廓的矩形边界(C++实现).zip
针对边沿对比度比较低的情况,可以考虑以下优化:
1. 调整阈值:可以根据实际情况调整阈值,使其适应较低的对比度。
2. 应用高斯滤波:可以在进行Sobel算子处理之前,应用高斯滤波对图像进行平滑处理,以减少噪声的干扰和提升边缘检测的准确性。
3. 应用Canny算子:Canny算子是一种常用的边缘检测算法,可以检测出较弱的边缘,并且可以自适应调整阈值。可以在投影处理后,应用Canny算子进行边缘检测。
4. 使用多尺度边缘检测:可以使用多个尺度对图像进行边缘检测,以检测出不同尺度下的边缘信息,并且可以提高对低对比度边缘的检测能力。
5. 学习使用深度学习模型:可以使用深度学习模型进行边缘检测,例如使用卷积神经网络模型进行图像分割和边缘检测。这种方法需要大量的数据和计算资源,但可以获得更好的检测效果。
阅读全文