11- OpenCV:自定义线性滤波(卷积,卷积边缘)

这篇具有很好参考价值的文章主要介绍了11- OpenCV:自定义线性滤波(卷积,卷积边缘)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、卷积

1、卷积概念

2、卷积如何工作

3、常见算子(卷积核 Kenel)

4、自定义卷积模糊

5、代码演示

二、卷积边缘

1、卷积边缘问题

2、处理边缘

3、相关的API说明

4、代码演示


一、卷积

1、卷积概念

(1)在OpenCV中,卷积是一种常用的图像处理操作,用于图像滤波、特征提取等任务。它基于滑动窗口的概念,通过将一个小的核Kenel(也称为滤波器)与图像进行逐像素的乘法和求和运算来实现。

— 卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。

— Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

(2)卷积操作可以理解为在图像上滑动一个小的核,并将核的每个元素与对应位置的图像像素值相乘,然后将所有乘积结果相加得到输出图像的对应像素值。这个过程可以简单地表示为:

output(x, y) = sum(kernel(i, j) * input(x+i, y+j))

其中,output(x, y)是输出图像的像素值,kernel(i, j)是核的元素值,input(x+i, y+j)是输入图像的像素值。

(3)卷积操作在图像处理中有多种应用,其中最常见的是图像滤波。通过选择不同的核,可以实现不同的滤波效果,例如平滑滤波、边缘检测等。卷积操作还可以用于图像特征提取,例如使用卷积神经网络(CNN)进行图像分类、目标检测等任务。

在OpenCV中,可以使用cv::filter2D函数来进行卷积操作。该函数接受输入图像、核以及输出图像作为参数,并将卷积结果存储在输出图像中。

2、卷积如何工作

把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。数学表达如下

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

公式讲解:

K(i,j):卷积核的大小

I里面的参数就是窗口的半径

两个方向X、Y方向上的求和

例子:从左到右,从上到下进行计算

Sum = 8x1+6x1+6x1+2x1+8x1+6x1+2x1+2x1+8x1

New pixel = sum / (m*n)

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

3、常见算子(卷积核 Kenel)

(1)Robert算子:又称“梯度算子”

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

(2)Sobel算子:中间2*2,更大,比Robert算子的差异更大,效果可能更明显了

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

(3)拉普拉斯算子

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

4、自定义卷积模糊

(1)filter2D方法

filter2D (

Mat src, //输入图像

Mat dst, // 模糊图像

int depth, // 图像深度32/8,不知道的就默认-1,系统也默认和src的深度一样

Mat kernel, // 卷积核/模板

Point anchor = Point(-1,-1) , // 锚点位置,3、5、7、9,或者默认自动寻找中心位置

double delta = 0 // 计算出来的像素+delta

其中 kernel是可以自定义的卷积核

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

5、代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv)
{
	Mat src, dst;
	int ksize = 0;

	src = imread("test.jpg");
	if (!src.data)
	{
		printf("could not load image...\n");
		return -1;
	}

	char INPUT_WIN[] = "input image";
	char OUTPUT_WIN[] = "Custom Blur Filter Result";
	namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);

	imshow(INPUT_WIN, src);

	// Robert 算子 X 方向
	//Mat Robert_x = (Mat_<int>(2, 2) << 1, 0, 0, -1);
	//Mat mat_Robert_x;
	//filter2D(src, mat_Robert_x, -1, Robert_x);
	//imshow("Robert x", mat_Robert_x);

	 Robert 算子 Y 方向
	//Mat Robert_y = (Mat_<int>(2, 2) << 0, 1, -1, 0);
	//Mat mat_Robert_y;
	//filter2D(src, mat_Robert_y, -1, Robert_y);
	//imshow("Robert y", mat_Robert_y);

	// Sobel X 方向
	Mat kernel_x = (Mat_<int>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);
	filter2D(src, dst, -1, kernel_x, Point(-1, -1), 0.0);
	imshow("Sobel X", dst);

	// Sobel Y 方向
	Mat yimg;
	Mat kernel_y = (Mat_<int>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);
	filter2D(src, yimg, -1, kernel_y, Point(-1, -1), 0.0);
	imshow("Sobel Y", yimg);


	// 拉普拉斯算子
	//Mat kernel_y = (Mat_<int>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);
	//filter2D(src, dst, -1, kernel_y, Point(-1, -1), 0.0);
	//imshow("拉普拉斯", dst);
	
	waitKey(0);

    // 自定义卷积模糊
	//int c = 0;
	//int index = 0;
	//while (true)null
	//{
	//	c = waitKey(500);
	//	if ((char)c == 27) // ESC
	//	{ 
	//		break;
	//	}
	//	ksize = 5 + (index % 8) * 2;
	//	Mat kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);
	//	filter2D(src, dst, -1, kernel, Point(-1, -1));
	//	index++;
	//	imshow(OUTPUT_WIN, dst);
	//}

	return 0;
}

效果展示:

(1)Robert算子,在X与Y方向上呈现出差异性

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

(2)Sobel算子:相对与Robert算子,差异会明显一些

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

(3)拉普拉斯算子:碎发也没看到了

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算

二、卷积边缘

1、卷积边缘问题

卷积边缘问题:图像卷积的时候边界像素,不能被卷积操作。

原因:在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理。

2、处理边缘

在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3x3在 四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之 后再去掉这些边缘。

openCV中默认的处理方法是: BORDER_DEFAULT,此外 常用的还有如下几种:

- BORDER_CONSTANT – 填充边缘用指定像素值  

- BORDER_REPLICATE – 填充边缘像素用已知的边缘像素值

- BORDER_WRAP – 用另外一边的像素来补偿填充

3、相关的API说明

给图像添加边缘API:copyMakeBorder

copyMakeBorder(  

- Mat src, // 输入图像  

- Mat dst, // 添加边缘图像  

- int top, // 边缘长度,一般上下左右都取相同值,

 - int bottom,  

- int left,  

- int right,  

- int borderType // 边缘类型  

- Scalar value

4、代码演示

增加边缘的四种策略,都适用于什么场景,如何处理卷积的边缘。

先认识下:GaussianBlur()

GaussianBlur函数用于对图像进行高斯模糊操作。它可以有效地去除图像中的噪声,并平滑图像的细节。

void GaussianBlur (

InputArray src, // 输入图像,可以是单通道或多通道图像

OutputArray dst, // 输出图像,与输入图像具有相同的尺寸和类型

Size ksize, // 高斯核的大小,用Size(w, h)表示。它必须是正奇数,例如(3, 3)、(5, 5)等。

double sigmaX, // 高斯核在X方向上的标准差

double sigmaY = 0, // 高斯核在Y方向上的标准差。如果为0,则默认使用sigmaX的值

int borderType = BORDER_DEFAULT // 边界处理方式,默认为BORDER_DEFAULT

);

int main(int argc, char** argv) 
{
	Mat src, dst;
	src = imread("test.jpg");
	if (!src.data) 
	{
		printf("could not load image...\n");
		return -1;
	}
	char INPUT_WIN[] = "input image";
	char OUTPUT_WIN[] = "Border Demo";
	namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
	imshow(INPUT_WIN, src);
	/*
	int top = (int)(0.05*src.rows);
	int bottom = (int)(0.05*src.rows);
	int left = (int)(0.05*src.cols);
	int right = (int)(0.05*src.cols);
	RNG rng(12345);
	int borderType = BORDER_DEFAULT;

	int c = 0;
	while (true) 
	{
		c = waitKey(500);
		// ESC
		if ((char)c == 27) 
			break;

		if ((char)c == 'r') 
			borderType = BORDER_REPLICATE;
		else if((char)c == 'w') 
			borderType = BORDER_WRAP;
		else if((char)c == 'c') 
			borderType = BORDER_CONSTANT;

		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		copyMakeBorder(src, dst, top, bottom, left, right, borderType, color);
		imshow(OUTPUT_WIN, dst);
	}
	*/


    // 上面的代码可以直接用下面接口替换
	GaussianBlur(src, dst, Size(5, 5), 0, 0);
	imshow(OUTPUT_WIN, dst);

	waitKey(0);
	return 0;
}

效果展示:

11- OpenCV:自定义线性滤波(卷积,卷积边缘),OpenCV,opencv,人工智能,计算机视觉,图像卷积,边缘计算文章来源地址https://www.toymoban.com/news/detail-804342.html

到了这里,关于11- OpenCV:自定义线性滤波(卷积,卷积边缘)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • opencv#31 非线性滤波——中值滤波

         中值滤波原理与均值滤波相似。在滤波器的范围内,将滤波器所覆盖的图像的像素,进行排序后,选取序列中中间位置的数值作为滤波后的结果,此过程不含任何线性操作,所以称为非线性滤波,对图像中数据进行排序可以很好的移除掉某些区域中突然出现的较大值。

    2024年01月23日
    浏览(32)
  • opencv#30 线性滤波

    Step1:求和。 Step2:计算平均值。      所谓均值滤波,就是求平均值的意思。我们假设在一个3*3的范围内有一个图像,其中这个图像每一个像素可能含有噪声,也可能不含噪声,我们是不知道的,因此通过均值滤波的方式,对图像中所有像素进行求和,并除以像素个数,得到的

    2024年01月23日
    浏览(17)
  • python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

    第一件事情还是先做名词解释,图像平滑到底是个啥? 从字面意思理解貌似图像平滑好像是在说图像滑动。 emmmmmmmmmmmmmmm。。。。 其实半毛钱关系也没有,图像平滑技术通常也被成为图像滤波技术(这个名字看到可能大家会有点感觉)。 每一幅图像都包含某种程度的噪声,

    2024年02月04日
    浏览(37)
  • OPENCV C++(五)滤波函数+sobel边缘检测+人脸磨皮mask

     中值滤波 平均滤波 高斯滤波(最后一个是方差 越大越模糊) sobel的边缘检测函数   利用高斯滤波对人脸进行平滑处理,学习mask的应用 人脸阈值 将原图转化为HSV类型,找出人脸并并给maskmat(这里是一个区域,人脸所包含是roi) 对原图进行高斯滤波 将高斯滤波后的人脸区

    2024年02月14日
    浏览(30)
  • 04- 图像卷积及图片的模糊和边缘检测 (OpenCV系列) (机器视觉)

    知识重点 padding指的就是填充的0的圈数 重构图片大小:  img = cv2.resize(img, dsize=(300, 300)) 模糊操作 :  dst = cv2.filter2D (img, -1, kernel) 模糊操作 : 方盒滤波 :  dst = cv2.boxFilter (img, -1, (5, 5), normalize = True)   # normalize = True时, a = 1 / (W * H) 滤波器的宽高, 且此时方盒滤波等价于均值滤波

    2024年02月02日
    浏览(29)
  • 【OpenCV • c++】图像平滑处理(1) —— 线性滤波

      平滑处理也称为模糊处理,是一种简单且使用频率很高的图像处理方法,平滑处理的用途有很多,最常见的是用来减少图像上的噪点或者失真。在涉及到降低图像分辨率时,平滑处理是非常好用的方法。   图像滤波指的是在尽量保留图像细节特征的条件下对图像的噪音

    2024年03月20日
    浏览(39)
  • Opencv之图像滤波:1.图像卷积(cv2.filter2D)

            写这些博客主要是记录自己学习Opencv的过程,也希望能帮助到大家。                  在OpenCV中,允许用户自定义卷积核实现卷积操作,使用自定义卷积核实现卷积操作的函数是cv2.filter2D(),其语法格式为:         dst=cv2.filter2D(src,ddepth,kernel,anchor,d

    2023年04月08日
    浏览(74)
  • 数字图像处理【11】OpenCV-Canny边缘提取到FindContours轮廓发现

    本章主要介绍图像处理中一个比较基础的操作:Canny边缘发现、轮廓发现 和 绘制轮廓。概念不难,主要是结合OpenCV 4.5+的API相关操作,为往下 \\\"基于距离变换的分水岭图像分割\\\" 做知识储备。 在讲述轮廓之前,要花点时间学学边缘检测提取的一个著名算法——Canny边缘提取算法

    2024年02月16日
    浏览(29)
  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(45)
  • 《opencv实用探索·十二》opencv之laplacian(拉普拉斯)边缘检测,Scharr边缘检测,Log边缘检测

    1、Laplacian算子 Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。同时,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使

    2024年04月10日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包