- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
函数使用 Scharr 运算符计算图像的第一个 x- 或 y- 空间导数。
调用
Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType) \texttt{Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType)} Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType)
等同于
Sobel(src, dst, ddepth, dx, dy, FILTERSCHARR, scale, delta, borderType) \texttt{Sobel(src, dst, ddepth, dx, dy, FILTERSCHARR, scale, delta, borderType)} Sobel(src, dst, ddepth, dx, dy, FILTERSCHARR, scale, delta, borderType)
Scharr() 函数是 OpenCV 中用于计算图像梯度的一个函数,它是一种改进的 Sobel 操作算子,能够提供更精确的梯度估计。Scharr() 函数通常用于边缘检测和特征提取等图像处理任务中。
函数原型
cpp
void cv::Scharr
(
InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
)
参数
- 参数src 输入图像。
- 参数dst 与 src 具有相同大小和通道数的输出图像。
- 参数ddepth 输出图像深度,参见 combinations
- 参数dx x 方向导数的阶数。
- 参数dy y 方向导数的阶数。
- 参数scale 可选的缩放因子,应用于计算出的导数值;默认情况下,不应用任何缩放(参见 getDerivKernels 以获取更多细节)。
- 参数delta 可选的 delta 值,在存储结果之前添加到结果中。
- 参数borderType 像素外推方法,参见 BorderTypes。BORDER_WRAP 不受支持。
代码示例
cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
// 加载图像
cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/erik.jpg", cv::IMREAD_GRAYSCALE );
if ( img.empty() )
{
std::cout << "无法加载图像,请检查路径是否正确。" << std::endl;
return -1;
}
cv::Size sz2Sh( 400, 600 );
cv::resize( img, img, sz2Sh, 0, 0, cv::INTER_LINEAR_EXACT );
// 计算 x 方向和 y 方向的梯度
cv::Mat grad_x, grad_y;
cv::Mat abs_grad_x, abs_grad_y;
cv::Scharr( img, grad_x, CV_32F, 1, 0 ); // 计算 x 方向梯度
cv::Scharr( img, grad_y, CV_32F, 0, 1 ); // 计算 y 方向梯度
// 转换为绝对值
cv::convertScaleAbs( grad_x, abs_grad_x );
cv::convertScaleAbs( grad_y, abs_grad_y );
// 显示结果
cv::namedWindow( "Original Image", cv::WINDOW_NORMAL );
cv::imshow( "Original Image", img );
cv::namedWindow( "Gradient X", cv::WINDOW_NORMAL );
cv::imshow( "Gradient X", abs_grad_x );
cv::namedWindow( "Gradient Y", cv::WINDOW_NORMAL );
cv::imshow( "Gradient Y", abs_grad_y );
cv::waitKey( 0 ); // 等待按键
return 0;
}