OpenCV filter2D函数详解

这篇具有很好参考价值的文章主要介绍了OpenCV filter2D函数详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

     OpenCV filter2D函数简介   

        OpenCV filter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。

        该函数实际上计算相关性,而不是卷积:

cv::filter2d,opencv,计算机视觉,OpenCV图像线性滤波函数,filter2D函数实例详解,filter2D函数应用实例,图像锐化,图像滤波

  filter2D函数的原型如下:

        void cv::filter2D(InputArray src,

                                        OutputArray dst,

                                        int  ddepth,

                                        InputArray  kernel,

                                        Point  anchor = Point(-1,-1),

                                        double  delta = 0,

                                        int       borderType = BORDER_DEFAULT

                                        )

参数:

        src 输入图像

       dst  输出图像,与 src 大小相同、通道数相同

       ddepth  目标图像的所需深度

        kernel 卷积核(或者更确切地说是相关核),单通道浮点矩阵;如果要将不同的内核应用于                        不同的通道,请使用 split 将图像分割为单独的颜色平面并单独处理它们。

        anchor 内核的锚点,指示内核中过滤点的相对位置;锚应该位于内核内;默认值(-1,-1)                      表示锚点位于内核中心。

        delta  在将过滤像素存储到 dst 之前添加到过滤像素的可选值。

        borderType 像素外推方法。可以选以下几种:BORDER_CONSTANT,BORDER_REPLICATE,BORDER_REFLECT,BORDER_REFLECT_101,BORDER_TRANSPARENT,BORDER_REFLECT101,BORDER_DEFAULT,BORDER_ISOLATED。

        OpenCV filter2D函数应用

        使用OpenCV filter2D函数,通过改变卷积核(kernel)可达成不同的滤波效果。下面就OpenCV filter2D函数的几种常用场景做说明,并以实例做演示。

        图像锐化

        图像锐化使用的卷积核如下:

        Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

        下面以实例演示图像锐化操作及锐化效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat src = imread("1.jpg");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	
	imshow("Input Image", src);

	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	imshow("Output Image", dst);

	waitKey(0);
	return 0;
}

试运行,结果如下:

cv::filter2d,opencv,计算机视觉,OpenCV图像线性滤波函数,filter2D函数实例详解,filter2D函数应用实例,图像锐化,图像滤波

        可以看到经过Filter2D滤波后的图像变得更清晰。

均值滤波

        OpenCV filter2D函数实现均值滤波的卷积核如下:

Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;

下面以实例演示filter2D实现图像均值滤波操作及滤波效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	//sharp test
	/*
	Mat src = imread("1.jpg");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	
	imshow("Input Image", src);


	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	imshow("Output Image", dst);
	*/

	//Mean filter test
	Mat src = imread("3.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	imshow("Input Image", src);

	Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	for (size_t i = 0; i < 15; i++)
	{
		filter2D(dst, dst, src.depth(), kernel);
	}
	imshow("Output Image", dst);

	waitKey(0);
	return 0;
}

       试运行,结果如下:

 cv::filter2d,opencv,计算机视觉,OpenCV图像线性滤波函数,filter2D函数实例详解,filter2D函数应用实例,图像锐化,图像滤波

可以看出,均值滤波可以去除图像椒盐噪声,达到磨皮效果。

 高斯滤波

OpenCV filter2D函数实现高斯滤波的卷积核可由高斯核转换得到,方法如下:

Mat kernelGaussian = getGaussianKernel(9, 1.5);
Mat  kernel = kernelGaussian * kernelGaussian.t();

下面以实例演示filter2D实现图像高斯滤波操作及滤波效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	//filter2d sharp test
	/*
	Mat src = imread("1.jpg");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	
	imshow("Input Image", src);


	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	imshow("Output Image", dst);
	*/

	//filter2d Mean filter test
	/*
	Mat src = imread("3.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	imshow("Input Image", src);

	Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	for (size_t i = 0; i < 15; i++)
	{
		filter2D(dst, dst, src.depth(), kernel);
	}
	imshow("Output Image", dst);
	*/

	//filter2d Gaussian filter test
	Mat src = imread("3.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	imshow("Input Image", src);

	Mat kernelGaussian = getGaussianKernel(9, 1.5);
	Mat  kernel = kernelGaussian * kernelGaussian.t();
	Mat dst;
	filter2D(src, dst, src.depth(), kernel);
	for (size_t i = 0; i < 6; i++)
	{
		filter2D(dst, dst, src.depth(), kernel);
	}
	imshow("Output Image", dst);

	waitKey(0);
	return 0;
}

试运行,结果如下:

cv::filter2d,opencv,计算机视觉,OpenCV图像线性滤波函数,filter2D函数实例详解,filter2D函数应用实例,图像锐化,图像滤波可以看出,同样filter2D均高斯滤波同样可以去除图像椒盐噪声,达成磨皮效果,且所需次数更少。

 边缘检测

 filter2D还可以使用sobel内核实现边缘检测,soble内核如下:

Mat sobelX = (Mat_<float>(3, 3) << -1, 0, 1,-2, 0, 2,-1, 0, 1);
Mat sobelY = (Mat_<float>(3, 3) << -1, -2, -1,0, 0, 0,1, 2, 1);

下面以实例演示filter2D 用sobel核实现图像边缘检测操作及滤波效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	//filter2d sharp test
	/*
	Mat src = imread("1.jpg");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	
	imshow("Input Image", src);


	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	imshow("Output Image", dst);
	*/

	//filter2d Mean filter test
	/*
	Mat src = imread("3.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	imshow("Input Image", src);

	Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	for (size_t i = 0; i < 15; i++)
	{
		filter2D(dst, dst, src.depth(), kernel);
	}
	imshow("Output Image", dst);
	*/

	//filter2d Gaussian filter test
	/*
	Mat src = imread("3.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	imshow("Input Image", src);

	Mat kernelGaussian = getGaussianKernel(9, 1.5);
	Mat  kernel = kernelGaussian * kernelGaussian.t();
	Mat dst;
	filter2D(src, dst, src.depth(), kernel);
	for (size_t i = 0; i < 6; i++)
	{
		filter2D(dst, dst, src.depth(), kernel);
	}
	imshow("Output Image", dst);
	*/

	//filter2d detect edges test
	Mat src = imread("4.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	threshold(src, src, 127, 255, THRESH_BINARY);
	imshow("Input Image", src);

	Mat sobelX = (Mat_<float>(3, 3) << -1, 0, 1,-2, 0, 2,-1, 0, 1);
	Mat sobelY = (Mat_<float>(3, 3) << -1, -2, -1,0, 0, 0,1, 2, 1);

	Mat edges,edgesX, edgesY;
	filter2D(src, edgesX, CV_16S, sobelX);
	filter2D(src, edgesY, CV_16S, sobelX);

	convertScaleAbs(edgesX, edgesX);
	convertScaleAbs(edgesY, edgesY);
	addWeighted(edgesX, 0.5, edgesY, 0.5, 0, edges);

	imshow("Edges", edges);

	waitKey(0);
	return 0;
}

试运行,结果如下:

cv::filter2d,opencv,计算机视觉,OpenCV图像线性滤波函数,filter2D函数实例详解,filter2D函数应用实例,图像锐化,图像滤波

        可以看出确实检测到了边缘,效果并不是很好。

        filter2D还可以使用Prewitt核,实现边缘检测。Prewitt核如下:

        Mat prewitt_x = (Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
        Mat prewitt_y = (Mat_<int>(3, 3) << -1, -1, -1,0, 0, 0, 1, 1, 1);

        下面以实例演示filter2D 用Prewitt核实现图像边缘检测操作及滤波效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	//filter2d sharp test
	/*
	Mat src = imread("1.jpg");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	
	imshow("Input Image", src);


	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	imshow("Output Image", dst);
	*/

	//filter2d Mean filter test
	/*
	Mat src = imread("3.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	imshow("Input Image", src);

	Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;
	Mat dst;

	filter2D(src, dst, src.depth(), kernel);
	for (size_t i = 0; i < 15; i++)
	{
		filter2D(dst, dst, src.depth(), kernel);
	}
	imshow("Output Image", dst);
	*/

	//filter2d Gaussian filter test
	/*
	Mat src = imread("3.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	imshow("Input Image", src);

	Mat kernelGaussian = getGaussianKernel(9, 1.5);
	Mat  kernel = kernelGaussian * kernelGaussian.t();
	Mat dst;
	filter2D(src, dst, src.depth(), kernel);
	for (size_t i = 0; i < 6; i++)
	{
		filter2D(dst, dst, src.depth(), kernel);
	}
	imshow("Output Image", dst);
	*/

	//filter2d detect edges test
	/*
	//sobel kernel
	Mat src = imread("4.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	threshold(src, src, 127, 255, THRESH_BINARY);
	imshow("Input Image", src);

	Mat sobelX = (Mat_<float>(3, 3) << -1, 0, 1,-2, 0, 2,-1, 0, 1);
	Mat sobelY = (Mat_<float>(3, 3) << -1, -2, -1,0, 0, 0,1, 2, 1);

	Mat edges,edgesX, edgesY;
	filter2D(src, edgesX, CV_16S, sobelX);
	filter2D(src, edgesY, CV_16S, sobelX);

	convertScaleAbs(edgesX, edgesX);
	convertScaleAbs(edgesY, edgesY);
	addWeighted(edgesX, 0.5, edgesY, 0.5, 0, edges);

	imshow("Edges", edges);
	*/

	//Prewitt kernel
	Mat src = imread("4.png");
	if (src.empty())
	{
		cout << "Cann't open Image" << endl;
		return -1;
	}
	threshold(src, src, 127, 255, THRESH_BINARY);
	imshow("Input Image", src);

	Mat prewitt_x = (Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
	Mat prewitt_y = (Mat_<int>(3, 3) << -1, -1, -1,0, 0, 0, 1, 1, 1);
	
	Mat edges, edgesX, edgesY;
	filter2D(src, edgesX, src.depth(), prewitt_x);
	filter2D(src, edgesY, src.depth(), prewitt_y);
	addWeighted(edgesX, 0.5, edgesY, 0.5, 0, edges);

	imshow("Edges", edges);

	waitKey(0);
	return 0;
}

试运行,结果如下:

cv::filter2d,opencv,计算机视觉,OpenCV图像线性滤波函数,filter2D函数实例详解,filter2D函数应用实例,图像锐化,图像滤波

        从结果可以看出,filter2D使用Prewitt核检测边缘的结果,与使用sobel核边缘检测的结果是有差异的。

      OpenCV  filter2D函数就介绍到这里。博文示例是基于OpenCV4.8(opencv目录位于d盘根目录下)及VS2022。示例源码已上传到CSDN,其链接为:https://mp.csdn.net/mp_blog/creation/editor/136590730文章来源地址https://www.toymoban.com/news/detail-848537.html

到了这里,关于OpenCV filter2D函数详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像平滑处理-卷积函数filter2D详解及均值滤波案例

    图像平滑处理-卷积函数filter2D详解及均值滤波案例 图像处理是计算机视觉中的重要分支。在图像处理中,平滑滤波是一项基本任务。平滑滤波可以消除图像中的噪声和细节,使其更加平滑和清晰。OpenCV-Python是一个常用的图像处理库,它提供了各种图像处理函数和算法。这里

    2024年02月05日
    浏览(32)
  • Opencv cv2.putText 函数详解

    具体函数如下: 函数源码如下: 对应的参数如下: 参数 具体表述 image 绘制的图像 text 绘制的文本 org 文本在图像中显示的坐标,用元组表示格式为(X坐标,Y坐标) font 文本字体类型,值可以为 FONT_HERSHEY_SIMPLEX 、 FONT_HERSHEY_PLAIN fontScale 字体比例因子乘以font-specific基本大小 c

    2024年02月09日
    浏览(47)
  • 【Opencv】cv::dnn::NMSBoxes()函数详解

    本文通过原理和示例对cv::dnn::NMSBoxes()进行解读,帮助大家理解和使用。 cv::dnn::NMSBoxes是OpenCV库中的一个函数,用于在目标检测中处理多个预测框。在目标检测中,模型可能会为同一个物体生成多个预测框,这时就需要通过非极大值抑制(Non-Maximum Suppression,NMS)来抑制冗余

    2024年02月04日
    浏览(82)
  • python-opencv-cv2.inRange函数()函数详解

    cv2.inRange( hsv, lower_red, upper_red ) 参数 描述 hsv 指的是原图 lower_red 指的是图像中低于这个lower_red的值,图像值变为0(黑) upper_red 指的是图像中高于这个upper_red的值,图像值变为0(黑) lower_red~upper_red 在lower_red~upper_red之间的值变成255(白)

    2024年04月09日
    浏览(27)
  • 画圆操作——OpenCV中cv2.circle函数详解

    画圆操作——OpenCV中cv2.circle函数详解 在计算机视觉领域,图像处理是最基础的操作,而画圆操作又是其中不可或缺的一部分。在OpenCV中,cv2.circle函数可以实现画圆的功能。 下面是cv2.circle函数的基本格式: 其中各参数含义如下: img:要进行画圆操作的图片。 center:圆心坐

    2024年02月09日
    浏览(33)
  • 【C++】【Opencv】cv::Canny()边缘检测函数详解和示例

    Canny边缘检测是一种流行的边缘检测算法,由John F. Canny在1986年开发。它是一种多阶段过程,包括噪声滤波、计算图像强度的梯度、非最大值抑制以及双阈值检测。本文通过函数原型解读和示例对cv::Canny()函数进行详解,以帮助大家理解和使用。 Canny边缘检测的步骤如下: (

    2024年02月04日
    浏览(42)
  • 【Python/Opencv】图像权重加法函数:cv2.addWeighted()详解

    在OpenCV图像加法cv2.add函数详解详细介绍了图像的加法运算。 除了这种加法外,OpenCV还提供了带权重的加法,即两副图像的像素通道值相加时各自按一定的权重比例取值来相加。 假设有2个图像矩阵src1和src2,在两个图像融合时,各自的权重分别为alpha和beta,则二者融合后的目

    2024年02月15日
    浏览(56)
  • python-opencv-cv2.threshold()二值化函数详解

    cv2.threshold( src, thresh, maxval, type[, dst] ) → retval, dst 参数 描述 src 表示的是图片源 thresh 表示的是阈值(起始值) maxval 表示的是最大值 type 表示的是这里划分的时候使用的是方法选择参数 常用值为0(cv2.THRESH_BINARY) 第四个是一个方法选择参数,常用的有: • cv2.THRESH_BINARY(黑

    2024年02月15日
    浏览(30)
  • 详解cv2.addWeighted函数【使用 OpenCV 添加(混合)两个图像-Python版本】

    有的时候我们需要将两张图片在alpha通道进行混合,比如深度学习数据集增强方式MixUp。OpenCV的 addWeighted 提供了相关操作,此篇博客将详细介绍这个函数,并给出代码示例。🚀🚀 o u t p u t I m g = s a t u r a t e ( α ∗ i n p u t I m g 1 + β ∗ i n p u t I m g 2 + γ ) rm outputImg=saturate( al

    2024年02月06日
    浏览(54)
  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

    仿射变换是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移、缩放、旋转等操作。通过原理、函数和

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包