cany边缘检测算法(坎尼算法)

砍尼算法是最优的边缘检测器

预备知识:


图像梯度:在一幅图像f(x,y)位置处寻找的边缘强度和方向,所选工具就是梯度。


求取图像梯度的方法:用模板算子:如sobel算子等,算子有方向区别,x方向算子,y方向算子


通过模板可以得到Gx(x,y),Gy(x,y)两张与原图像尺寸一样的梯度图,Gx(x,y),Gy(x,y)分表表示x,y方向的梯度图



cany边缘求取算法


步骤;

用高斯滤波平滑图像(去掉细节,使大边缘在分割后效果更明显);

计算梯度幅值图像和角度赋值图像:M(x,y)=|Gx|+|Gy|;,角度幅值图像为a(x,y)=arctan[Gy/Gx],(x,y)为图像的取值范围为图像各像素点坐标;

对梯度幅值图像应用非最大抑制;

用双鱼之处理和链接分析来检测并链接边缘。


应用实例

#include "stdafx.h"





#include <opencv2/opencv.hpp>   
#include <opencv2/highgui.hpp>   
#include<iostream>    
#define PI 3.1415926    
#define R 150    

using namespace cv;
using namespace std;
Mat getHistImg(const MatND& hist);

int main()
{
    Mat result;//声明一个表示图像的变量;
    Mat gray;
    int height;
    int width;
    gray = imread("../13.jpg");
   


    Canny(gray, result, 20, 100, 3);//cany算法函数,gray为输入图像,result为输出图像,20为第阈   值,100为高阈值,3为sobel算子尺寸
    
     

   
    imshow("1", result);
   

     waitKey(0);

}


int main()
{
    Mat image,image1, abs_image, abs_image1,result;//声明一个表示图像的变量;
    Mat gray;
 
    int height;
    int width;

    gray = imread("../13.jpg");
    cvtColor(gray, gray, CV_BGR2GRAY);
    medianBlur(gray, gray, 11);
    height = gray.rows;
    width = gray.cols* gray.channels();   // 列项要乘通道数  

    for (int i = 0; i< height; i++)
    {
        for (int j = 0; j< width; j++)
        {
            if (gray.at<uchar>(i, j) > 69)
                gray.at<uchar>(i, j) = 255; //- gray.at<uchar>(i, j);   // 每一个像素反转  
            else
                gray.at<uchar>(i, j) = 0;
        }
    }
   
  
          /*用sobel算子提取边缘*/
   
    Sobel(gray, image1, CV_8U, 0, 1, 3, 1, 0, BORDER_DEFAULT);//提取y方向的
    Sobel(gray, image, CV_8U, 1, 0, 3, 1, 0, BORDER_DEFAULT);//提取x方向的
    convertScaleAbs(image1, abs_image1);           //对提取到的梯度图求绝对值
    convertScaleAbs(image, abs_image);
    addWeighted(abs_image1, 0.5, abs_image, 0.5, 0, result);   //求取梯度幅值图像result
      
       
    imshow("1", result);

   
    waitKey(0);

}    








  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值