Canny边缘检测原理 及 opencv 的 C++ 实现

Canny算子

Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
好的检测- 算法能够尽可能多地标识出图像中的实际边缘。
好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘

实现步骤:

  1. 滤波(消除噪声)
  2. 梯度幅度及方向角计算(增强)
  3. 边缘非极大值抑制
  4. 用滞后阈值法求解图像边缘

代码实现


#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>


using namespace std;
using namespace cv;

//极大值抑制
void nonMaximumSuppression(Mat &magnitudeImage, Mat &directionImage) {

    Mat checkImage = Mat(magnitudeImage.rows, magnitudeImage.cols, CV_8U);
    //迭代器初始化
    MatIterator_<float>itMag = magnitudeImage.begin<float>();
    MatIterator_<float>itDirection = directionImage.begin<float>();
    MatIterator_<unsigned char>itRet = checkImage.begin<unsigned char>();
    MatIterator_<float>itEnd = magnitudeImage.end<float>();
    //遍历,计算对应的方向
    for ( ; itMag != itEnd ; ++itDirection,++itRet,++itMag)
    {
        //将方向进行划分,对每个方向进行幅值判断
        const Point pos = itRet.pos();
        float currentDirection = atan(*itDirection)*(180 / 3.142);
        while (currentDirection<0)
        {
            currentDirection += 180;
            *itDirection = currentDirection;
            //边界线定,对相应的方向进行判断
            if (currentDirection>22.5 && currentDirection <=
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值