边缘(edge)是指图像局部强度变化最显著的部分。主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征和形状特征等图像分析的重要基础。图像强度的显著变化可分为:
阶跃变化函数,即图像强度在不连续处的两边的像素灰度值有着显著的差异
线条(屋顶)变化函数,即图像强度突然从一个值变化到另一个值,保持一较小行程后又回到原来的值
图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈.边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘。
ab分别是阶跃函数和屋顶函数的三维图像
cd是阶跃和屋顶函数的函数二维图像
ef对应一阶导数
gh是二阶导数
Sobel算子是一种常用的边缘检测算子,是一阶的梯度算法。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
void Sobel( InputArray src, OutputArray dst, int ddepth,int dx, int dy, int ksize = 3,double scale = 1, double delta = 0,int borderType = BORDER_DEFAULT );
/*******************************************************************
* src: 输入图
* dst: 输出图
* ddepth: 输出图深度 CV_16S/CV_32F/CV_64F等
* dx: x方向上的差分阶数
* dy: y方向上的差分阶数
* ksize: 卷积核大小,一般5*5或3*3
* scale: 计算导数值时可选的缩放因子
* delta: 默认为0
* borderType: 边缘处理模式
*********************************************************************/
拉普拉斯对噪声敏感,会产生双边效果。不能检测出边的方向。通常不直接用于边的检测,只起辅助的角色,检测一个像素是在边的亮的一边还是暗的一边利用零跨越,确定边的位置.
void Laplacian( InputArray src, OutputArray dst, int ddepth,int ksize = 1, double scale = 1, double delta = 0,int borderType = BORDER_DEFAULT );
/*******************************************************************
* src: 输入图
* dst: 输出图
* ddepth: 输出图深度 CV_16S/CV_32F/CV_64F等
* ksize: 核大小,必须是正奇数,默认值是1
* scale: 计算导数值时可选的缩放因子
* delta: 可选值,默认为0
* borderType: 边缘处理模式
*********************************************************************/
void Canny( InputArray image, OutputArray edges,double threshold1, double threshold2,int apertureSize = 3, bool L2gradient = false );
/*******************************************************************
* src: 输入图
* edges: 输出图
* threshold1: 第一个阈值
* threshold2: 第二个阈值
* apertureSize: 内核大小
* L2gradient: 计算图像梯度幅值方法的标志
*********************************************************************/
注意:
①相关函数说明
convertScaleAbs(result["y"], result["y"]); //图像增强函数 addWeighted(result["x"], 0.5, result["y"], 0.5, 0, result["xy"]); //将两个图像按一定权值融合在一起
②sobel算子和拉普拉斯算子处理完后效果并不会太好,需要调用图像增强函数。
#include
#include
#include
显然最佳的方法是用二值化的灰度图像,然后高斯滤波处理,再去用canny检测算法(两个阈值的选定很重要---->要多试试)(得到的OK图像如下,边缘的线条很细,且取出了原本canny算法算出来的很多的噪声)