Canny边缘检测算法一直是边缘检测的经典算法。下面通过再nanopi fire上来实现这一算法,这里调用opencv函数就可以,它函数原型为:
void cvCanny(
const CvArr* image,
CvArr* edges,
double threshold1,double threshold2,
int aperture_size=3
);
简单说下函数用法:
第一个参数表示输入图像,必须为单通道灰度图。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
下面是实验代码:
#include
#include
using namespace cv;
int main( )
{
Mat srcImage = imread("aaa.png");
imshow("Canny", srcImage);
Mat dstImage,edge,grayImage;
dstImage.create( srcImage.size(), srcImage.type() );
cvtColor( srcImage, grayImage, CV_BGR2GRAY );
blur( grayImage, edge, Size(3,3) );
Canny( edge, edge, 3, 9,3 );
imshow("Result of Canny", edge);
waitKey(0);
return 0;
}
Canny边缘检测基本原理:
(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。
(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
上面只要简单将图像传给调用的函数,然后将处理后的图像保存到另一个结构体显示即可,下面是实验效果图
Canny边缘检测算法一直是边缘检测的经典算法。下面通过再nanopi fire上来实现这一算法,这里调用opencv函数就可以,它函数原型为:
void cvCanny(
const CvArr* image,
CvArr* edges,
double threshold1,double threshold2,
int aperture_size=3
);
简单说下函数用法:
第一个参数表示输入图像,必须为单通道灰度图。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
下面是实验代码:
#include
#include
using namespace cv;
int main( )
{
Mat srcImage = imread("aaa.png");
imshow("Canny", srcImage);
Mat dstImage,edge,grayImage;
dstImage.create( srcImage.size(), srcImage.type() );
cvtColor( srcImage, grayImage, CV_BGR2GRAY );
blur( grayImage, edge, Size(3,3) );
Canny( edge, edge, 3, 9,3 );
imshow("Result of Canny", edge);
waitKey(0);
return 0;
}
Canny边缘检测基本原理:
(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。
(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
上面只要简单将图像传给调用的函数,然后将处理后的图像保存到另一个结构体显示即可,下面是实验效果图