zoukankan      html  css  js  c++  java
  • OpenCV3编程入门读书笔记5-边缘检测

    一、边缘检测的一般步骤

    1、滤波

    边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。

    2、增强

    增强边缘的基础是确定图像各点领域强度的变化值。增强算法可以将图像灰度点领域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。

    3、检测

    经过增强的图像,往往领域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。

    二、基于Canny、Sobel、laplacian、Scharr算子的边缘检测示例

    Mat srcImage = imread("E:\CodeResource\opencv\car_pic\car5.jpg",0);
    imshow("srcImage", srcImage);
    
    Mat canyImage;
    Canny(srcImage, canyImage, 3, 9, 3);
    imshow("canyImage", canyImage);
    
    Mat sobel_x;
    Mat sobel_y;
    Mat sobelImage;
    Sobel(srcImage, sobel_x,CV_16S,1,0,3,1,1,BORDER_DEFAULT);
    convertScaleAbs(sobel_x, sobel_x);
    Sobel(srcImage, sobel_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
    convertScaleAbs(sobel_y, sobel_y);
    addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0, sobelImage);
    imshow("sobel_x", sobel_x);
    imshow("sobel_y", sobel_y);
    imshow("sobelImage", sobelImage);
    
    Mat laplacianImage;
    Laplacian(srcImage, laplacianImage, CV_16S, 3, 1, 0, BORDER_DEFAULT);
    convertScaleAbs(laplacianImage, laplacianImage);
    imshow("laplacianImage", laplacianImage);
    
    Mat scharr_x;
    Mat scharr_y;
    Mat scharrImage;
    Scharr(srcImage, scharr_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);
    convertScaleAbs(scharr_x, scharr_x);
    Scharr(srcImage, scharr_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT);
    convertScaleAbs(scharr_y, scharr_y);
    addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0, scharrImage);
    
    imshow("scharr_x", scharr_x);
    imshow("scharr_y", scharr_y);
    imshow("scharrImage", scharrImage);
    
    waitKey(0);

    效果图:

  • 相关阅读:
    迭代器、生成器
    函数(函数基础、装饰器、递归、匿名函数)
    文件处理
    python对象、引用
    字符编码
    流程控制if、while、for
    编程与编程语言
    Java源码阅读(五)—— AbstractQueuedSynchronizer
    Java并发编程(二) —— volatile
    Java源码阅读(七)—— ReentrantReadWriteLock
  • 原文地址:https://www.cnblogs.com/justkong/p/7297836.html
Copyright © 2011-2022 走看看