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

2024-04-28 21:08:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在Python中使用OpenCV。我知道OpenCV中有很多边缘检测算法,比如Canny、Sobel、laplace,但这些都是为了过滤图像。我想实际测量边缘的强度。OpenCV中有什么算法可以提供这个功能吗?或者我只是编写自己的算法来测量边缘强度?


Tags: 图像算法应用程序目标opencv边缘物体焦距
2条回答

您可以计算大小,如下所示:

  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;
}

下面是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)

相关问题 更多 >