测量OpenCV中的边缘强度,梯度的大小

时间:2015-11-12 19:32:21

标签: python algorithm opencv computer-vision

我有一个应用程序,我需要检查相机的焦点。为此,我想测量单轴(1D)上几个预定义位置的边缘强度(梯度的大小)。图像目标将是一段时间背景上的黑色物体的简单打印输出。

我正在使用OpenCV和Python。我知道在OpenCV中有几种边缘检测算法,如Canny,Sobel,laplace,但所有这些都是为了过滤图像。我想实际测量边缘的强度。 OpenCV中是否有可以提供此功能的算法?或者我只是编写自己的算法来测量边缘强度?

2 个答案:

答案 0 :(得分:6)

这是一个Python版本:

def getGradientMagnitude(im):
    "Get magnitude of gradient for given image"
    ddepth = cv2.CV_32F
    dx = cv2.Sobel(im, ddepth, 1, 0)
    dy = cv2.Sobel(im, ddepth, 0, 1)
    dxabs = cv2.convertScaleAbs(dx)
    dyabs = cv2.convertScaleAbs(dy)
    mag = cv2.addWeighted(dxabs, 0.5, dyabs, 0.5, 0)
    return mag

mag = getGradientMagnitude(im)

答案 1 :(得分:4)

您可以计算如下的幅度:

  1. 计算dxdy衍生物(使用cv::Sobel
  2. 计算幅度sqrt(dx^2 + dy^2)(使用cv::magnitude
  3. 这是一个计算渐变幅度的简单C ++代码。您可以轻松移植到Python,因为它只是对OpenCV函数的一些调用:

    #include <opencv2/opencv.hpp>
    using namespace cv;
    
    int main()
    {
        //Load image
        Mat3b img = imread("path_to_image");
    
        //Convert to grayscale
        Mat1b gray;
        cvtColor(img, gray, COLOR_BGR2GRAY);
    
        //Compute dx and dy derivatives
        Mat1f dx, dy;
        Sobel(gray, dx, CV_32F, 1, 0);
        Sobel(gray, dy, CV_32F, 0, 1);
    
        //Compute gradient
        Mat1f magn;
        magnitude(dx, dy, magn);
    
        //Show gradient
        imshow("Magnitude", magn);
        waitKey();
    
        return 0;
    }