- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
对图像应用分离式线性滤波器。
该函数对图像应用分离式线性滤波器。首先,src 的每一行都用 1D 内核 kernelX 进行滤波。然后,结果的每一列都用 1D 内核 kernelY 进行滤波。最终结果加上 delta 后存储在 dst 中。
sepFilter2D() 函数是 OpenCV 中用于应用分离式滤波器的一种高效方法。这种滤波器可以将二维卷积分解为两个一维卷积操作,从而显著减少计算量。
函数原型
cpp
void cv::sepFilter2D
(
InputArray src,
OutputArray dst,
int ddepth,
InputArray kernelX,
InputArray kernelY,
Point anchor = Point(-1,-1),
double delta = 0,
int borderType = BORDER_DEFAULT
)
参数
- 参数src 输入图像。
- 参数dst 输出图像;与输入图像具有相同的大小和通道数。
- 参数ddepth 输出图像深度,参见 combinations
- 参数kernelX 用于过滤每一行的系数矩阵。
- 参数kernelY 用于过滤每一列的系数矩阵。
- 参数anchor 内核中的锚点位置。默认值 (-1, -1) 表示锚点位于内核中心。
- 参数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 );
// 定义滤波器核
cv::Mat kernelX = ( cv::Mat_< float >( 1, 3 ) << 1, 0, -1 );
cv::Mat kernelY = ( cv::Mat_< float >( 3, 1 ) << 1, 2, 1 );
// 应用分离式线性滤波器
cv::Mat dst;
cv::sepFilter2D( img, dst, CV_32F, kernelX, kernelY );
// 转换为绝对值
cv::Mat abs_dst;
cv::convertScaleAbs( dst, abs_dst );
// 显示结果
cv::namedWindow( "Original Image", cv::WINDOW_NORMAL );
cv::imshow( "Original Image", img );
cv::namedWindow( "Filtered Image", cv::WINDOW_NORMAL );
cv::imshow( "Filtered Image", abs_dst );
cv::waitKey( 0 ); // 等待按键
return 0;
}