(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是可以自定义的卷积核
(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)
(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
振幅图像
(1)理论
解释:在二阶导数的时候,最大变化处的值为0即边缘是0,通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘
(2)处理流程
高斯模糊——去噪声GaussianBlur()
转换为灰度图像cvtColor()
拉普拉斯—二阶导数计算Laplacian()
取绝对值convertScaleAbs()
显示结果
(3)API使用cv::laplance
Laplacian(gray_src, edge_image, CV_16S, 3);
(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来归一化);
