小言_互联网的博客

canny的c++实现

515人阅读  评论(0)

 

目录

一、用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

 


转载:https://blog.csdn.net/Bluenapa/article/details/101852645
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场