Opencv(C++)学习系列---Canny边缘检测算法-创新互联
目录
网站设计制作过程拒绝使用模板建站;使用PHP+MYSQL原生开发可交付网站源代码;符合网站优化排名的后台管理系统;成都网站设计、网站制作收费合理;免费进行网站备案等企业网站建设一条龙服务.我们是一家持续稳定运营了10年的创新互联网站建设公司。【1】边缘检测算法流程
【2】Canny算子介绍
【3】完整代码
【1】边缘检测算法流程
- 使用高斯滤波器来平滑图像,达到滤除噪声的效果。(降噪)
- 计算图像中每个像素点的梯度大小和方向(求梯度,与sobel算法求梯度一致)
- 使用非极大值抑制,消除边缘检测带来的不利影响(非极大抑制)
- 使用双域值法监测确定真实和潜在的边缘(双域值检测)
- 通过抑制孤立的弱边缘完成边缘检测(抑制弱边缘)
具体算法流程可以参考该文章:
【2】Canny算子介绍https://zhuanlan.zhihu.com/p/494567705
void Canny( InputArray image, OutputArray edges,
double threshold1, double threshold2,
int apertureSize = 3, bool L2gradient = false );
具体参数介绍:
第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,可以为三通道彩色图像,也可以是单通道的灰度图像。
第二个参数,OutputArray类型的edges,输出的边缘图,是单通道的边缘图像。
第三个参数,double类型的threshold1,第一个滞后性阈值。
第四个参数,double类型的threshold2,第二个滞后性阈值。
Canny采用俩个阈值,根据边缘响应的灰度图,大于高阈值的为强边缘,小于低阈值的为弱边缘,介于强弱边缘的值采用搜索算法。在8个领域内是否存在强边缘,如果存在强边缘,则该点就可以设置为强边缘。
第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。
第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。
#include#include#includeusing namespace cv;
using namespace std;
int main(int argc,char** argv)
{
//载入原始图
Mat src = imread("E:\\乔大花进度\\11-28\\边缘检测\\2.jpg");
Mat src1 = src.clone();
Mat src2(src.size(),CV_8UC1);
//第一种直接使用边缘检测canny算法
//blur(src2,src2,Size(3,3));
Canny(src,src2,150,180);
imshow("边缘检测1",src2);
//第二种高阶边缘检测算法,转为灰度图,降噪,用Canny得到最后的边缘作为掩码,转到原图得到效果图,得到色彩的边缘图
Mat dst, edge, gray;
//【1】创建与src同类型和大小的矩阵(dst)
dst.create(src1.size(),src1.type());
//【2】将彩色图转为灰度图
cvtColor(src1,gray,COLOR_BGR2GRAY);
//【3】先使用3x3的内核用来降噪
blur(gray,edge,Size(3,3));
//【4】运行canny算法
Canny(edge, edge, 3, 9);
//【5】将dst中的像素都置为0
dst = Scalar::all(0);
//【6】与edge为掩码,将src2复制到dst中
src1.copyTo(dst,edge);
//【7】显示效果图
imshow("边缘检测2",dst);
//显示原始图
imshow("原图",src);
waitKey(0);
system("pause");
destroyAllWindows();
return 0;
}
运行结果:
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享文章:Opencv(C++)学习系列---Canny边缘检测算法-创新互联
新闻来源:http://cdiso.cn/article/isgeh.html