opencv 可分离滤波

2022-08-04 11:28:35

小白学视觉,笔记,扩展

在这里插入图片描述
分离为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矩阵),一次完成
结果一致

  • 作者:R-G-B
  • 原文链接:https://blog.csdn.net/m0_51233386/article/details/123397929
    更新时间:2022-08-04 11:28:35