一尘不染

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

algorithm

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

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


阅读 360

收藏
2020-07-28

共1个答案

一尘不染

您可以像这样计算幅度:

  1. 计算dxdy派生(使用cv::Sobel
  2. 计算幅度sqrt(dx^2 + dy^2)(使用cv::magnitude

这是一个计算梯度大小的简单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;
}
2020-07-28