在 OpenCV 中测量边缘强度,梯度大小
Measure edge strength in OpenCV, magnitude of gradient
我有一个应用程序需要检查相机的焦点。为此,我想在单个轴 (1D) 上的几个预定义位置测量边缘强度(梯度幅度)。图像目标将是白色背景上黑色对象的简单打印输出。
我在 Python 中使用 OpenCV。我知道 OpenCV 中有几种边缘检测算法,如 Canny、Sobel、laplace,但所有这些都是为了过滤图像。我想实际测量边缘的强度。 OpenCV 中是否有任何算法可以提供此功能?还是我只写自己的算法来测量边缘强度?
您可以像这样计算震级:
- 计算
dx
和 dy
导数(使用 cv::Sobel
)
- 计算震级
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)
我有一个应用程序需要检查相机的焦点。为此,我想在单个轴 (1D) 上的几个预定义位置测量边缘强度(梯度幅度)。图像目标将是白色背景上黑色对象的简单打印输出。
我在 Python 中使用 OpenCV。我知道 OpenCV 中有几种边缘检测算法,如 Canny、Sobel、laplace,但所有这些都是为了过滤图像。我想实际测量边缘的强度。 OpenCV 中是否有任何算法可以提供此功能?还是我只写自己的算法来测量边缘强度?
您可以像这样计算震级:
- 计算
dx
和dy
导数(使用cv::Sobel
) - 计算震级
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)