opencv图像边缘检测

来源:互联网 发布:淘宝网怎么开网店啊 编辑:程序博客网 时间:2024/05/01 04:45

边缘检测检测
&&边缘检测可以提取图像重要轮廓信息,减少图像内容,可以用于分割图像,做特征 提取
&&边缘检测的一般步骤
滤波——(滤出噪声对检测边缘的影响) 滤高频
增强——(可以将像素邻域强度变化凸显出来–梯度算子)变化率
检测——(阈值方法确定边缘)
&&常用边缘检测算子
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);
原创粉丝点击