OpenCV边缘处理Sobel算子、Laplance算子和Canny边缘检测

it2025-11-09  19

1.自定义线性滤波

(1)卷积概念

卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作,Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)

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

                                             

(2)常见算子

Robert算子,sobel算子,拉普拉斯算子

 

(3)自定义卷积模糊

Filter2D方法filter2D(Mat      src,//输入图像

                                Mat      dst,//模糊图像

                                Int        depth,//图像深度32/8

                                Mat      kernel,//卷积核/模板

                                Point    anchor,//锚点位置

                                Double         delta//计算出来的像素+delta)

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

3.处理边缘

(1)卷积边缘问题

图像卷积的时候边界像素,不能被卷积处理,原因在于边界像素没有完全跟kernel重叠,所以当3*3滤波时候有一个像素的边缘没有被处理,5*5滤波的时候有2个像素的边缘没有被处理。

(2)处理边缘

在卷积开始之前增加边缘计算,填充的像素值为0或者RGB黑色,比如3*3在四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之后再去掉这些边缘。Opencv中默认的处理方法是:BORDER_DEFAULT,此外常用的还有:

BORDER_CONSTANT——填充边缘用指定像素

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

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

(3)API说明——给图像添加边缘API

CopyMakeBorder(Mat   src,//输入图像

                             Mat    dst,//添加边缘图像

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

                             Int      bottom,//

                             Int      left,

                             Int      right,

                             Int     borderType,//边缘类型

                             Scalar          value)

4.Sobel算子

(1)卷进应用——图像边缘提取

边缘是什么——是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用

如何捕捉/提取边缘——对图像求它的一阶导数delta=f(x)-f(x-1),delta越大,说明像素在x方向变化越大,边缘信号越强

(2)Sobel算子

是离散微分算子,用来计算图像灰度的近似梯度

Sobel算子功能集合高斯平滑和微分求导,又被称为一阶微分算子,求导算子,在水平和垂直俩个方向上求导,得到图像X方向与Y方向梯度图像

求取导数的近似值,kernel=3时不是很准确,OpenCV使用改进版本Scharr函数,算子如下:

(4)相关APIcv::Sobel(Scharr)

Cv::Sobel(inputArray        src,//输入图像

                   OutputArray    dst,//输出图像,大小与输入图像一致

                   Int             depth,//输出图像深度

                   Int             dx,//x方向,几阶导数

                   Int             dy,//y方向,几阶导数

                   Int             ksize,//Sobel算子kernel大小必须是1,3,5,7

                   Double     scale=1,//

                   Double     delta=0

                   Int             borderType=BORDER_DEFAULT)

(5)步骤:

高斯平滑

转灰度

求梯度X和Y

振幅图像

5.Laplance算子

(1)理论

解释:在二阶导数的时候,最大变化处的值为0即边缘是0,通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘

(2)处理流程

高斯模糊——去噪声GaussianBlur()

转换为灰度图像cvtColor()

拉普拉斯—二阶导数计算Laplacian()

取绝对值convertScaleAbs()

显示结果

(3)API使用cv::laplance

    Laplacian(gray_src, edge_image, CV_16S, 3);

6.Canny边缘检测

(1)Canny算法介绍

Canny是边缘检测算法,很好的边缘检测器

(2)步骤流程——五步

高斯模糊——GaussianBlur灰度转换——cvtColor计算梯度——Sobel/Scharr非最大信号抑制高低阈值输出二值图像

(3)非最大信号抑制

(4)高低阈值输出二值图像

T1,T2,为阈值,凡是高于T2的都保留,凡是小于T1都丢弃,从高于T2的像素出发,凡是大于T1而且相互连接的,都保留。最终得到一个输出二值图像,推荐的高低阈值比值为T2:T1=3:1/2:1其中T2为高阈值,T1为低阈值

(5)API cv::Canny()

Canny(inputarray     src,//8-bit的输入图像(灰度图像)

           Outputarray                   edges,//输出边缘图像,一般都是二值图像,背景是黑色

           Double          threshold1,//低阈值,常取高阈值的1/2或者1/3

           Double          threshold2,//高阈值

           Int                 apterturesize,//sobel算子的size,通常3*3,取值3

           Bool              L2gradient//选择true表示L2来归一化,否则用L1来归一化);

最新回复(0)