小白学视觉,笔记,扩展
分离为X、Y方向的滤波器,无论是先X方向,还是先Y方向,叠加结果和没有分离的滤波结果一样;
节省时间,为处理加速提供可能;
行滤波器3个数据,列滤波3个数据;
如果直接滤波,9个数据,增加了时间。
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
float points[25] = { 1,2,3,4,5,
6,7,8,9,10,
11,12,13,14,15,
16,17,18,19,20,
21,22,23,24,25 };
Mat data(5, 5, CV_32FC1, points);
//X方向、Y方向和联合滤波器的构建
Mat a = (Mat_<float>(3, 1) << -1, 3, -1);
cout<<a.channels()<<endl;
Mat b = a.reshape(1, 1);//Mat reshape(int cn, int rows=0)//转换成,单通道,1行
Mat ab = a * b;//3*3的矩阵
//线性滤波的可分离性
Mat dataYX, dataY, dataXY, dataXY_sep;
//先Y,再X (单方向),两次完成,根据尺寸K*1,1*K区分Y,X 的
filter2D(data, dataY, -1, a, Point(-1, -1), 0, BORDER_CONSTANT);
filter2D(dataY, dataYX, -1, b, Point(-1, -1), 0, BORDER_CONSTANT);
//YX联合后(3*3矩阵),一次完成
filter2D(data, dataXY, -1, ab, Point(-1, -1), 0, BORDER_CONSTANT);
//可分离滤波,X,Y方向分别滤波(等价先Y(X),再X(Y)),但一次完后
sepFilter2D(data, dataXY_sep, -1, b, b, Point(-1, -1), 0, BORDER_CONSTANT);//参数4和5,都是b,不影响,代表的还是X,Y,根据参数位置区分,并不是根据参数尺寸区分X,Y
//验证高斯滤波的可分离性
Mat gaussX = getGaussianKernel(3, 1);
Mat gaussData, gaussDataXY;
GaussianBlur(data, gaussData, Size(3, 3), 1, 1, BORDER_CONSTANT);
sepFilter2D(data, gaussDataXY, -1, gaussX, gaussX, Point(-1, -1), 0, BORDER_CONSTANT);
//输入两种高斯滤波的计算结果
cout << "gaussData=" << endl
<< gaussData << endl;
cout << "gaussDataXY=" << endl
<< gaussDataXY << endl;
//输出分离滤波和联合滤波的计算结果
cout << "dataY=" << endl
<< dataY << endl;
cout << "dataYX=" << endl
<< dataYX << endl;
cout << "dataXY=" << endl
<< dataXY << endl;
cout << "dataXY_sep=" << endl
<< dataXY_sep << endl;
//对图像的分离操作
Mat img = imread("lena.png");
if (img.empty())
{
cout << "请确认图像文件名称是否正确" << endl;
return -1;
}
Mat imgYX, imgY, imgXY;
filter2D(img, imgY, -1, a, Point(-1, -1), 0, BORDER_CONSTANT);
filter2D(imgY, imgYX, -1, b, Point(-1, -1), 0, BORDER_CONSTANT);
filter2D(img, imgXY, -1, ab, Point(-1, -1), 0, BORDER_CONSTANT);
imshow("img", img);
imshow("imgY", imgY);
imshow("imgYX", imgYX);
imshow("imgXY", imgXY);
waitKey(0);
return 0;
}
3*3的高斯滤波
高斯X,Y方向分离的滤波
对比,结果一样,验证了高斯滤波的可分离性
GaussianBlur(data, gaussData, Size(3, 3), 1, 1, BORDER_CONSTANT);
sepFilter2D(data, gaussDataXY, -1, gaussX, gaussX, Point(-1, -1), 0, BORDER_CONSTANT);
先Y,再X (单方向),两次完成,根据尺寸K1,1K区分Y,X 的
YX联合后(3*3矩阵),一次完成
可分离滤波,X,Y方向分别滤波(等价先Y(X),再X(Y)),但一次完后
三者结果一致
先Y,再X (单方向),两次完成,
YX联合后(3*3矩阵),一次完成
结果一致