日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

OpenCV-C++ Canny算法介绍

發(fā)布時間:2023/12/19 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 OpenCV-C++ Canny算法介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄Canny理論原理過濾噪聲計(jì)算圖像梯度非最大值抑制算子(NMS)雙閾值算法檢測邊緣和連接邊緣OpenCV Canny使用

注意:文章原理還很不完善,僅供本人學(xué)習(xí)使用;

Canny理論原理

Canny邊緣檢測器是由John F. Canny在1986年提出,Canny被稱為最優(yōu)檢測器,其目標(biāo)滿足以下三個主要標(biāo)準(zhǔn):

低錯誤率:對已有的邊界能夠有很好的檢測;
良好的定位:即檢測到的邊緣像素和實(shí)際邊緣像素之間的距離必須最小化;
最小響應(yīng):即每邊只有一個響應(yīng);

Canny算法主要包含以下五個步驟:

過濾噪聲

使用高斯濾波器去噪,高斯核如下圖所示:

計(jì)算圖像梯度

首先,在圖像利用Sobel算子計(jì)算x, y兩個方向的梯度:

其次,計(jì)算梯度的強(qiáng)度和方向:

其中,梯度的方向被四舍五入到[0, 45, 90, 135]這幾個角度;

非最大值抑制算子(NMS)

抑制那些梯度不夠大的像素點(diǎn),只保留最大的像素點(diǎn),從而達(dá)到瘦邊的目的;

雙閾值算法檢測邊緣和連接邊緣

經(jīng)過NMS算法后,設(shè)置兩個閾值(T_1, T_2),通常(T_1)是(T_2)的(1/2)或者(1/3);

梯度值大于(T_2)的像素點(diǎn)稱為強(qiáng)邊緣,保留作為圖像邊緣;
梯度值小于(T_1)的像素點(diǎn)不是邊緣,舍棄;
針對梯度值大于(T_1),小于(T_2)的像素點(diǎn),稱為弱邊緣;

針對弱邊緣,需要進(jìn)一步判定其是否的真正的邊緣像素點(diǎn);判別的方法就是,當(dāng)弱邊緣像素點(diǎn)周圍8個領(lǐng)域內(nèi)存在強(qiáng)邊緣像素時,則該弱邊緣變成強(qiáng)邊緣點(diǎn),否則不是邊緣點(diǎn);

OpenCV Canny使用

CannyAPI的介紹:

void Canny( InputArray image, OutputArray edges,
           double threshold1, double threshold2,
           int apertureSize = 3, bool L2gradient = false );

src輸入圖像,必須是8-bits;
edges輸出的圖像邊緣
threshold1, threshold2對應(yīng)于上述的(T_1, T_2);
apertureSizeSobel算子的大小;
L2gradient表示計(jì)算梯度值時是否使用(L2)(就是默認(rèn)的計(jì)算方式);

如果設(shè)置L2gradient=True,則梯度值的計(jì)算方式為:

[G = |G_x| + |G_y|
]

使用方式:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/**
 * 邊緣處理
*/

Mat src, srcBlur, srcGray;
const int MAX_THRESHOLD = 255;
int t1_value = 50;
char output_wind[] = "output";

void Canny_Demo(int, void*);

int main(){
    // 讀取圖像
    src = imread("/home/chen/dataset/lena.jpg");
    if (src.empty()){
        cout << "could not load image." << endl;
        return -1;
    }
    namedWindow("src", WINDOW_AUTOSIZE);
    imshow("src", src); 

    GaussianBlur(src, srcBlur, Size(3, 3), 0, 0);
    cvtColor(srcBlur, srcGray, COLOR_BGR2GRAY);

    namedWindow(output_wind, WINDOW_AUTOSIZE);
    createTrackbar("Threshold: ", output_wind, &t1_value, MAX_THRESHOLD, Canny_Demo);
    Canny_Demo(0, 0);

    waitKey(0); 
    return 0;
}

void Canny_Demo(int, void*){
    Mat edgeOutput;
    Canny(srcGray, edgeOutput, t1_value, t1_value*2, 3, false);
    imshow(output_wind, edgeOutput);
}

Reference:

學(xué)習(xí)筆記-canny邊緣檢測

總結(jié)

以上是生活随笔為你收集整理的OpenCV-C++ Canny算法介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。