canny的c++实现

目录

一、用Gaussian filter 平滑图像

二、用Sobel计算amplitude  & angle

三、对梯度幅值进行 non-maximu depression

四、用双阈值算法检测和连接边缘


一、用Gaussian filter 平滑图像

 

RGB-> GRAY

边缘检测是基于对图像灰度差异运算实现的,所以如果输入的是RGB彩色图像,需要先进行灰度图的转换。

Gray = R*0.299 + G*0.587 + B*0.114

注意一般情况下opencv中彩色图像各分量的排列顺序是B、G、R。

1-D gaussian 

2-D gaussian

 

计算gaussian 后还有一个归一化的过程。

二、用Sobel计算amplitude  & angle

对于待检测边缘的图像I,分别在水平(X)方向和垂直方向(Y)方向求导,方法是分别图像I与卷积核Gx和Gy进行卷积,公式表述如下:

                                                                  

之后对求得的水平和垂直方向的梯度图像上的每一点执行:

    

或更为简单粗暴的:

   

G即为Sobel求得的梯度图像。

角度计算如下。

三、对梯度幅值进行 non-maximu depression

非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0,对梯度图像中每个像素进行非极大值抑制的算法是:

1) 将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。

2) 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点, 否则该像素点将被抑制。
这里写图片描述

 

四、用双阈值算法检测和连接边缘

 指定一个低阈值A,一个高阈值B,一般取B为图像整体灰度级分布的70%,且B为1.5到2倍大小的A;

灰度值大于B的,置为255,灰度值小于A的,置为0;

灰度值介于A和B之间的,考察改像素点临近的8像素是否有灰度值为255的,若没有255的,表示这是一个孤立的局部极大值点,予以排除,置为0;若有255的,表示这是一个跟其他边缘有“接壤”的可造之材,置为255,之后重复执行该步骤,直到考察完之后一个像素点。


五 、canny的c++实现

传送门:https://download.csdn.net/download/bluenapa/11831251

发布了128 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Bluenapa/article/details/101852645