边缘检测检测
&&边缘检测可以提取图像重要轮廓信息,减少图像内容,可以用于分割图像,做特征 提取
&&边缘检测的一般步骤
滤波——(滤出噪声对检测边缘的影响) 滤高频
增强——(可以将像素邻域强度变化凸显出来–梯度算子)变化率
检测——(阈值方法确定边缘)
&&常用边缘检测算子
Canny算子
Sobel算子
Scharr算子
Laplacian 算子
Roberts算子 ,,Prewitt算子。。。。
1)Canny边缘检测
**消除噪声:一般情况下使用高斯平滑滤波器卷积降噪
**计算梯度幅值和方向:安装Sobel滤波器的步骤操作
**非极大值抑制:排除非边缘像素
**滞后阈值:滞后阈值需要两个阈值(高阈值和低阈值):
如果某一像素位置的幅值超过高阈值,该像素被保留为边缘像素
如果某一像素位置的幅值小于低阈值该像素被排除
如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高阈值的像素时被保留
void Canny(InputArray image,OutputArray edges,double threshold1,double threshild2,int apertureSize=3,bool L2gradient=false);
src:输入原图像(一般为单通道8位图像)
dst:输出边缘图像要求和src一样的尺寸和类型(单通道)
threshold1:滞后阈值低阈值(用于边缘连接)
threshold2:滞后阈值高阈值(控制边缘初始段)
推荐高低阈值比值在2:1到3:1之间
apertureSize:表示Sobel算子孔径的大小,默认为3
L2gradient:计算图像梯度幅值的标识
cvtColor(img,img,CV_BGR2GRAY);
Canny(img,img,30,100,3); 滑动条的使用
——————————————————————————————测摄像头有没有聚焦 聚焦会变白
2)Sobel算子
是一个主要用于边缘检测的离散微分算子,他结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度
分别在xy两个方向上求导 变化比较剧烈的求出来
void Sobel(InputArray src,OutputArray dst,int ddepth,int dx,indy,int ksize=3,double scale=1,double delta=0,int borderType=BORDER_DEFAULT);
src:输入图像
dst:输出图像要求和drc一样的尺寸和类型
ddepth:输出图像的深度,支持如下组合
若src.depth()=CV_8U,取ddepth=-1/CV_16S/CV_32F/CV_64F
若src.depth()=CV_16U/CV_16S,取ddepth=-1/CV_32F/CV_64F
若src.depth()=CV_32F取ddepth=-1/CV_32F/CV_64F
若src.depth()=CV_64F,取ddepth=-1/CV_64F
**dx: x方向上的差分阶数
**dy:Y方向上的差分阶数
**Ksize:默认值为3,表示Sobel核大小1,3,5,7
**delta():表示在结果存入目标图之前可选的delta值,默认值0
borderType:边缘模式,一般是默认
//对x,y求导的效果
Mat grad_x,grad_y;
Mat abs_grad_x,abs_grad_y,dst;
Mat img=imread("0.jpg",0);
imshow("src",img);
//X方向上的梯度
Sobel(img,grad_x,CV_16S,1,0,3,1,1BORDER_DERAULT);
convertScaleAbs(grad_x,abs_grad_x);//转换为8为无符号
imshow("x方向",abs_grad_x);
//Y方向上的梯度
Sobel(img,grad_y,CV_16S,0,1,3,1,1,BORDER_DEFAULT);
convertScaleAbs(grad_y,abs_grad_y);
imshow("Y方向",abs_grad_y);
addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,dst);//合并0.5的权重
imshow("合并效果",dst);