- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
函数返回用于计算空间图像导数的滤波系数。
该函数计算并返回用于空间图像导数的滤波系数。当 ksize=FILTER_SCHARR 时,生成 Scharr 3x3 核(参见 Scharr)。否则,生成 Sobel 核(参见 Sobel)。这些滤波器通常传递给 sepFilter2D 或其他函数。
这些系数可以用于计算图像的梯度,这对于边缘检测和其他基于梯度的图像处理任务非常重要。
函数原型
cpp
void cv::getDerivKernels
(
OutputArray kx,
OutputArray ky,
int dx,
int dy,
int ksize,
bool normalize = false,
int ktype = CV_32F
)
参数
- 参数kx 输出矩阵,包含行滤波系数。其类型为 ktype。
- 参数ky 输出矩阵,包含列滤波系数。其类型为 ktype。
- 参数dx 关于 x 的导数阶数。
- 参数dy 关于 y 的导数阶数。
- 参数ksize 孔径大小。它可以是 FILTER_SCHARR、1、3、5 或 7
- 参数normalize 标志,指示是否归一化(缩放)滤波系数。理论上,系数应该具有分母 =2 * ksize^2 - dx - dy - 2。如果你打算过滤浮点图像,你可能会使用归一化的内核。但是,如果你计算 8 位图像的导数,将结果存储在 16 位图像中,并希望保留所有的小数位,你可能想要设置 normalize=false。
- 参数ktype 这是指滤波系数的数据类型。它可以是 CV_32F(32 位浮点数)或 CV_64F(64 位浮点数)。
示例代码
cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
// 读取图像
cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/erik.jpg", cv::IMREAD_GRAYSCALE );
if ( src.empty() )
{
std::cout << "Error: Image cannot be loaded!" << std::endl;
return -1;
}
cv::Size sz2Sh( 400, 600 );
cv::resize( src, src, sz2Sh, 0, 0, cv::INTER_LINEAR_EXACT );
imshow( "原图", src );
cv::Mat dst;
cv::Mat kx, ky;
cv::getDerivKernels( kx, ky, 1, 0, 3, false );
cv::sepFilter2D( src, dst, src.depth(), kx, ky );
imshow( "sepFilter2D", dst );
cv::waitKey( 0 );
return 0;
}
运行结果
参数是cv::getDerivKernels( kx, ky, 1, 0, 3, false )时:
参数是cv::getDerivKernels( kx, ky, 1, 0, 5, false )时: