- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
應用一個可分離的線性濾波器到一個矩陣(圖像)。
該函數對矩陣應用一個可分離的線性濾波器。也就是說,首先,src 的每一行都用一維核 kernelX 進行濾波。然后,所得結果的每一列都使用一維核 kernelY 進行濾波。最終結果被返回。
支持的矩陣數據類型包括 CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。輸出圖像必須與輸入圖像具有相同的類型、大小和通道數。
cv::gapi::sepFilter 是 OpenCV 的 G-API 模塊中用于對圖像應用分離過濾器(separable filter)的一個函數。這個函數可以用來執行高效的二維卷積操作,特別適用于那些可以分解為兩個一維濾波器的情況。
函數原型
GMat cv::gapi::sepFilter
(const GMat & src,int ddepth,const Mat & kernelX,const Mat & kernelY,const Point & anchor,const Scalar & delta,int borderType = BORDER_DEFAULT,const Scalar & borderValue = Scalar(0)
)
注意:
在浮點計算的情況下,如果硬件支持,則會進行向最近的偶數舍入(如果沒有,則舍入到最近的值)。
函數文本ID是 “org.opencv.imgproc.filters.sepfilter”。
參數
-
參數 src: 源圖像。
-
參數 ddepth: 目標圖像的期望深度(支持以下 src.depth() 和 ddepth 的組合:
- 當 src.depth() = CV_8U 時,ddepth 可以是 -1/CV_16S/CV_32F/CV_64F
- 當 src.depth() = CV_16U/CV_16S 時,ddepth 可以是 -1/CV_32F/CV_64F
- 當 src.depth() = CV_32F 時,ddepth 可以是 -1/CV_32F/CV_64F
- 當 src.depth() = CV_64F 時,ddepth 可以是 -1/CV_64F 如果 ddepth=-1,輸出圖像將具有與源相同的深度)
-
參數kernelX: 用于濾波每一行的系數。
-
參數 kernelY: 用于濾波每一列的系數。
-
參數 anchor: 核內的錨點位置。默認值 (-1,-1) 表示錨點位于內核中心。
-
參數 delta: 在存儲之前添加到濾波結果中的值。
-
參數 borderType: 像素外推方法,參見 cv::BorderTypes。
-
參數 borderValue: 在常量邊界類型的情況下的邊界值。
代碼示例
#include <opencv2/gapi/gkernel.hpp>
#include <opencv2/gapi/imgproc.hpp>
#include <opencv2/opencv.hpp>int main()
{// 讀取輸入圖像cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_COLOR );if ( src.empty() ){std::cerr << "無法讀取圖像" << std::endl;return -1;}// 定義水平和垂直方向的卷積核cv::Mat kernelX = ( cv::Mat_< float >( 1, 3 ) << 1.0, 2.0, 1.0 ); // 示例水平卷積核cv::Mat kernelY = ( cv::Mat_< float >( 3, 1 ) << 1.0, 2.0, 1.0 ); // 示例垂直卷積核// 設置ddepth、anchor、delta和borderType等參數int ddepth = -1; // 輸出圖像將具有與src相同的深度cv::Point anchor( -1, -1 ); // 錨點位于卷積核中心double delta = 0; // 不添加額外值int borderType = cv::BORDER_DEFAULT;// 創建G-API網絡cv::GMat in;auto out = cv::gapi::sepFilter( in, ddepth, kernelX, kernelY, anchor, cv::Scalar( delta ), borderType );cv::GComputation comp( cv::GIn( in ), cv::GOut( out ) );// 應用到源圖像并獲取結果cv::Mat dst;comp.apply( cv::gin( src ), cv::gout( dst ) );// 顯示結果cv::imshow( "Original Image", src );cv::imshow( "Filtered Image", dst );cv::waitKey( 0 );return 0;
}