国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenCV 筆記(12):常用的邊緣檢測算子—— Canny

這篇具有很好參考價值的文章主要介紹了OpenCV 筆記(12):常用的邊緣檢測算子—— Canny。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

Part11. Canny 算子產(chǎn)生的背景

一階導(dǎo)數(shù)、二階導(dǎo)數(shù)的邊緣算子雖然簡單易用,但存在一些缺點(diǎn)。例如容易受噪聲影響,容易產(chǎn)生虛假邊緣。

John F. Canny 在 1986 年提出了 Canny 邊緣檢測算法。它是結(jié)合了梯度計算方法和非極大值抑制技術(shù)的一種邊緣檢測算法。該算法克服了之前的邊緣檢測算法在抑制噪聲和保持邊緣信息方面的缺陷,具有較好的性能。

Canny 邊緣檢測算法的優(yōu)點(diǎn):

  • 能夠有效地抑制噪聲,同時保持邊緣信息。

  • 能夠檢測到細(xì)小的邊緣。

  • 具有較高的魯棒性,能夠處理各種噪聲類型的圖像

Canny 邊緣檢測算法是最經(jīng)典的邊緣檢測算法之一,它在圖像分割、目標(biāo)檢測、圖像識別等領(lǐng)域有著廣泛的應(yīng)用。

Part22. ?Canny 算子

12.1 Canny 邊緣檢測的步驟

2.1.1 使用高斯濾波器平滑圖像去除噪聲

高斯濾波器是一種常用的平滑濾波器,它可以用來去除圖像中的噪聲。

使用高斯濾波器與原圖進(jìn)行卷積,該步驟將平滑圖像,以便在進(jìn)行梯度計算時可以更好地抑制噪聲。

2.1.2 計算圖像的梯度幅度和方向角

在該系列的第八篇文章中,我們曾介紹過圖像的梯度,它是圖像灰度變化的速率,可以用來表示圖像的邊緣信息。

梯度的大小表示圖像灰度變化的大小,梯度的方向表示圖像灰度變化的方向。梯度幅度表示梯度的大小,用來表示圖像灰度變化的劇烈程度。

Canny 邊緣檢測算法通常使用 Sobel 算子來計算圖像的梯度幅度和方向角。

其中,用 L1 范數(shù)來近似梯度幅度:

梯度的方向角:

//?計算梯度、梯度幅度和方向
Mat?gradXY,?theta;
theta?=?Mat::zeros(src.size(),?CV_8U);
Mat?grad_x,?grad_y;
Sobel(gauss,?grad_x,?CV_32F,?1,?0,?3);
Sobel(gauss,?grad_y,?CV_32F,?0,?1,?3);

Mat?gradX,?gradY;
convertScaleAbs(grad_x,?gradX);
convertScaleAbs(grad_y,?gradY);
gradXY?=?gradX?+?gradY;

2.1.3 使用非極大值抑制消除邊緣檢測的虛假響應(yīng)

非極大值抑制(Non-Maximum Suppression,NMS) 其思想是搜素局部最大值,抑制非極大值。

在 Canny 邊緣檢測算法中,非極大值抑制是指在一個鄰域內(nèi),對于一個像素點(diǎn)如果其梯度幅度小于其鄰域內(nèi)同方向梯度幅度的最大值,則該像素點(diǎn)不是邊緣點(diǎn)。在 8 鄰域內(nèi),非極大值抑制就只是在 0 度、90 度、45 度、135 度四個梯度方向上進(jìn)行的,每個像素點(diǎn)梯度方向按照相近程度用這四個方向來代替

OpenCV 筆記(12):常用的邊緣檢測算子—— Canny,opencv,筆記,人工智能,計算機(jī)視覺
非極大值抑制.png

這樣簡化了計算,因?yàn)楝F(xiàn)實(shí)中圖像中的邊緣梯度方向不一定是沿著這四個方向的,就需要進(jìn)行線性插值,會略顯繁瑣。

//?非最大值抑制
void?nonMaximumSuppression?(Mat?srcGx,?Mat?srcGy,?Mat?&gradXY,?Mat?&theta,?Mat?&dst)?{
????dst?=?gradXY.clone();
????for?(int?j?=?1;?j?<?gradXY.rows-1;?j++)?{
????????for?(int?i?=?1;?i?<?gradXY.cols-1;?i++)?{
????????????double?gradX?=?srcGx.ptr<uchar>(j)[i];
????????????double?gradY?=?srcGy.ptr<uchar>(j)[i];

????????????theta.ptr<uchar>(j)[i]?=?atan(gradY/gradX);?//計算梯度方向

????????????double?t?=?double(theta.ptr<uchar>(j)[i]);
????????????double?g?=?double(dst.ptr<uchar>(j)[i]);
????????????if?(g?==?0.0)?{
????????????????continue;
????????????}
????????????double?g0,?g1;
????????????if?((t?>=?-(3*M_PI/8))?&&?(t?<?-(M_PI/8)))?{
????????????????g0?=?double(dst.ptr<uchar>(j-1)[i-1]);
????????????????g1?=?double(dst.ptr<uchar>(j+1)[i+1]);
????????????}
????????????else?if?((t?>=?-(M_PI/8))?&&?(t?<?M_PI/8))?{
????????????????g0?=?double(dst.ptr<uchar>(j)[i-1]);
????????????????g1?=?double(dst.ptr<uchar>(j)[i+1]);
????????????}
????????????else?if?((t?>=?M_PI/8)?&&?(t?<?3*M_PI/8))?{
????????????????g0?=?double(dst.ptr<uchar>(j-1)[i+1]);
????????????????g1?=?double(dst.ptr<uchar>(j+1)[i-1]);
????????????}
????????????else?{
????????????????g0?=?double(dst.ptr<uchar>(j-1)[i]);
????????????????g1?=?double(dst.ptr<uchar>(j+1)[i]);
????????????}

????????????if?(g?<=?g0?||?g?<=?g1)?{
????????????????dst.ptr<uchar>(j)[i]?=?0.0;
????????????}
????????}
????}
}

2.1.4 使用雙閾值處理確定潛在邊緣

使用兩個閾值來確定邊緣。

  • 強(qiáng)邊緣點(diǎn)是梯度值大于高閾值的像素點(diǎn),將像素值置為255。

  • 弱邊緣點(diǎn)是梯度值大于低閾值但小于高閾值的像素點(diǎn),保留像素值不變。

  • 如果梯度值小于低閾值,則會被抑制,將像素值置為0。

//?雙閾值算法
void?doubleThreshold?(Mat?&src,?double?low,?double?high,?Mat?&dst)?{
????dst?=?src.clone();

????//?區(qū)分出強(qiáng)邊緣點(diǎn)和弱邊緣點(diǎn)
????for?(int?j?=?0;?j?<?src.rows?-?1;?j++)?{
????????for?(int?i?=?0;?i?<?src.cols?-?1;?i++)?{
????????????double?x?=?double(dst.ptr<uchar>(j)[i]);
????????????//?像素點(diǎn)為強(qiáng)邊緣點(diǎn),置255
????????????if?(x?>?high)?{
????????????????dst.ptr<uchar>(j)[i]?=?255;
????????????}
????????????//?像素點(diǎn)置0,被抑制掉
????????????else?if?(x?<?low)?{
????????????????dst.ptr<uchar>(j)[i]?=?0;
????????????}
????????}
????}
}

2.1.5 滯后連接

強(qiáng)邊緣點(diǎn)可以認(rèn)為是真的邊緣,弱邊緣點(diǎn)則可能是真的邊緣也可能是噪聲或顏色變化引起的。

通常會認(rèn)為,真實(shí)邊緣引起的弱邊緣點(diǎn)和強(qiáng)邊緣點(diǎn)是連通的,而又噪聲引起的弱邊緣點(diǎn)則不會。

Canny 算子中的滯后連接,是指將弱邊緣點(diǎn)連接到強(qiáng)邊緣點(diǎn),從而減少邊緣斷裂。也就是在一個弱邊緣點(diǎn)的 8 鄰域像素內(nèi),只要有強(qiáng)邊緣點(diǎn)存在,那么這個弱邊緣點(diǎn)的像素點(diǎn)置為 255 被保留下來;如果它的 8 鄰域內(nèi)不存在強(qiáng)邊緣點(diǎn),則這是一個孤立的弱邊緣點(diǎn),像素點(diǎn)置為 0。

//?通過滯后連接斷開的邊緣
void?hysteresis?(Mat?&src)?{
????//?循環(huán)找到強(qiáng)邊緣點(diǎn),把其領(lǐng)域內(nèi)的弱邊緣點(diǎn)變?yōu)閺?qiáng)邊緣點(diǎn)
????for?(int?j?=?1;?j?<?src.rows?-?2;?j++)?{
????????for?(int?i?=?1;?i?<?src.cols?-?2;?i++)?{
????????????//?如果該點(diǎn)是強(qiáng)邊緣點(diǎn)
????????????if?(src.ptr<uchar>(j)[i]?==?255)?{
????????????????//?遍歷該強(qiáng)邊緣點(diǎn)領(lǐng)域
????????????????for?(int?m?=?-1;?m?<?1;?m++)?{
????????????????????for?(int?n?=?-1;?n?<?1;?n++)?{
????????????????????????//?該點(diǎn)為弱邊緣點(diǎn)(不是強(qiáng)邊緣點(diǎn),也不是被抑制的0點(diǎn))
????????????????????????if?(src.ptr<uchar>(j?+?m)[i?+?n]?!=?0?&&?src.ptr<uchar>(j?+?m)[i?+?n]?!=?255)?{
????????????????????????????src.ptr<uchar>(j?+?m)[i?+?n]?=?255;?//該弱邊緣點(diǎn)補(bǔ)充為強(qiáng)邊緣點(diǎn)
????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????}

????for?(int?j?=?0;?j?<?src.rows?-?1;?j++)?{
????????for?(int?i?=?0;?i?<?src.cols?-?1;?i++)?{
????????????//?如果該點(diǎn)依舊是弱邊緣點(diǎn),及此點(diǎn)是孤立邊緣點(diǎn)
????????????if?(src.ptr<uchar>(j)[i]?!=?255?&&?src.ptr<uchar>(j)[i]?!=?255)?{
????????????????src.ptr<uchar>(j)[i]?=?0;?//該孤立弱邊緣點(diǎn)抑制
????????????}
????????}
????}
}

22.2 Canny 算子的實(shí)現(xiàn)

下面,將上述五個步驟結(jié)合起來,一步步實(shí)現(xiàn) Canny 邊緣檢測算法。

#include?<opencv2/opencv.hpp>
#include?<math.h>

using?namespace?std;
using?namespace?cv;

//?非最大值抑制
void?nonMaximumSuppression?(Mat?srcGx,?Mat?srcGy,?Mat?&gradXY,?Mat?&theta,?Mat?&dst)?{
????dst?=?gradXY.clone();
????for?(int?j?=?1;?j?<?gradXY.rows-1;?j++)?{
????????for?(int?i?=?1;?i?<?gradXY.cols-1;?i++)?{
????????????double?gradX?=?srcGx.ptr<uchar>(j)[i];
????????????double?gradY?=?srcGy.ptr<uchar>(j)[i];

????????????theta.ptr<uchar>(j)[i]?=?atan(gradY/gradX);?//計算梯度方向

????????????double?t?=?double(theta.ptr<uchar>(j)[i]);
????????????double?g?=?double(dst.ptr<uchar>(j)[i]);
????????????if?(g?==?0.0)?{
????????????????continue;
????????????}
????????????double?g0,?g1;
????????????if?((t?>=?-(3*M_PI/8))?&&?(t?<?-(M_PI/8)))?{
????????????????g0?=?double(dst.ptr<uchar>(j-1)[i-1]);
????????????????g1?=?double(dst.ptr<uchar>(j+1)[i+1]);
????????????}
????????????else?if?((t?>=?-(M_PI/8))?&&?(t?<?M_PI/8))?{
????????????????g0?=?double(dst.ptr<uchar>(j)[i-1]);
????????????????g1?=?double(dst.ptr<uchar>(j)[i+1]);
????????????}
????????????else?if?((t?>=?M_PI/8)?&&?(t?<?3*M_PI/8))?{
????????????????g0?=?double(dst.ptr<uchar>(j-1)[i+1]);
????????????????g1?=?double(dst.ptr<uchar>(j+1)[i-1]);
????????????}
????????????else?{
????????????????g0?=?double(dst.ptr<uchar>(j-1)[i]);
????????????????g1?=?double(dst.ptr<uchar>(j+1)[i]);
????????????}

????????????if?(g?<=?g0?||?g?<=?g1)?{
????????????????dst.ptr<uchar>(j)[i]?=?0.0;
????????????}
????????}
????}
}

//?用雙閾值算法檢測
void?doubleThreshold?(Mat?&src,?double?low,?double?high,?Mat?&dst)?{
????dst?=?src.clone();

????//?區(qū)分出強(qiáng)邊緣點(diǎn)和弱邊緣點(diǎn)
????for?(int?j?=?0;?j?<?src.rows?-?1;?j++)?{
????????for?(int?i?=?0;?i?<?src.cols?-?1;?i++)?{
????????????double?x?=?double(dst.ptr<uchar>(j)[i]);
????????????//?像素點(diǎn)為強(qiáng)邊緣點(diǎn),置255
????????????if?(x?>?high)?{
????????????????dst.ptr<uchar>(j)[i]?=?255;
????????????}
????????????//?像素點(diǎn)置0,被抑制掉
????????????else?if?(x?<?low)?{
????????????????dst.ptr<uchar>(j)[i]?=?0;
????????????}
????????}
????}
}

//?通過滯后連接斷開的邊緣
void?hysteresis?(Mat?&src)?{
????//?循環(huán)找到強(qiáng)邊緣點(diǎn),把其領(lǐng)域內(nèi)的弱邊緣點(diǎn)變?yōu)閺?qiáng)邊緣點(diǎn)
????for?(int?j?=?1;?j?<?src.rows?-?2;?j++)?{
????????for?(int?i?=?1;?i?<?src.cols?-?2;?i++)?{
????????????//?如果該點(diǎn)是強(qiáng)邊緣點(diǎn)
????????????if?(src.ptr<uchar>(j)[i]?==?255)?{
????????????????//?遍歷該強(qiáng)邊緣點(diǎn)領(lǐng)域
????????????????for?(int?m?=?-1;?m?<?1;?m++)?{
????????????????????for?(int?n?=?-1;?n?<?1;?n++)?{
????????????????????????//?該點(diǎn)為弱邊緣點(diǎn)(不是強(qiáng)邊緣點(diǎn),也不是被抑制的0點(diǎn))
????????????????????????if?(src.ptr<uchar>(j?+?m)[i?+?n]?!=?0?&&?src.ptr<uchar>(j?+?m)[i?+?n]?!=?255)?{
????????????????????????????src.ptr<uchar>(j?+?m)[i?+?n]?=?255;?//該弱邊緣點(diǎn)補(bǔ)充為強(qiáng)邊緣點(diǎn)
????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????}

????for?(int?j?=?0;?j?<?src.rows?-?1;?j++)?{
????????for?(int?i?=?0;?i?<?src.cols?-?1;?i++)?{
????????????//?如果該點(diǎn)依舊是弱邊緣點(diǎn),及此點(diǎn)是孤立邊緣點(diǎn)
????????????if?(src.ptr<uchar>(j)[i]?!=?255?&&?src.ptr<uchar>(j)[i]?!=?255)?{
????????????????src.ptr<uchar>(j)[i]?=?0;?//該孤立弱邊緣點(diǎn)抑制
????????????}
????????}
????}
}

int?main?()?{
????Mat?src?=?imread(".../street.jpg");
????imshow("src",src);

????Mat?gray;
????cvtColor(src,?gray,?cv::COLOR_BGR2GRAY);?//?灰度化
????Mat?gauss;

????GaussianBlur(gray,?gauss,?Size(5,?5),0);

????//?計算梯度、梯度幅度和方向
????Mat?gradXY,?theta;
????theta?=?Mat::zeros(src.size(),?CV_8U);
????Mat?grad_x,?grad_y;
????Sobel(gauss,?grad_x,?CV_32F,?1,?0,?3);
????Sobel(gauss,?grad_y,?CV_32F,?0,?1,?3);

????Mat?gradX,?gradY;
????convertScaleAbs(grad_x,?gradX);
????convertScaleAbs(grad_y,?gradY);
????gradXY?=?gradX?+?gradY;

????//?局部非極大值抑制
????Mat?nms;
????nonMaximumSuppression(grad_x,grad_y,gradXY,?theta,?nms);
????imshow("nms",nms);

????//?用雙閾值算法檢測
????Mat?dst;
????doubleThreshold(nms,?50,?100,??dst);
????imshow("thresh",dst);
????//?滯后連接
????hysteresis(dst);
????imshow("edge",dst);

????//?OpenCV?的?Canny?函數(shù)
????Mat?result;
????Canny(gauss,?result,?50,?100);
????imshow("canny",?result);

????waitKey(0);

????return?0;
}
OpenCV 筆記(12):常用的邊緣檢測算子—— Canny,opencv,筆記,人工智能,計算機(jī)視覺
一步步實(shí)現(xiàn)canny.png
OpenCV 筆記(12):常用的邊緣檢測算子—— Canny,opencv,筆記,人工智能,計算機(jī)視覺
自定義的canny和opencv的canny進(jìn)行對比.png

在上述代碼中 Canny() 函數(shù)是 OpenCV 自帶的函數(shù),放在這里主要是做一個對比。

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

其各個參數(shù)的含義:

第一個參數(shù) image:輸入的源圖像。

第二個參數(shù) edges:輸出的邊緣圖像。

第三個參數(shù) threshold1:低閾值。

第四個參數(shù) threshold2:高閾值。

第五個參數(shù) apertureSize:Sobel 算子的核大小。

第六個參數(shù) L2gradient:是否使用 L2 范數(shù)來計算梯度。默認(rèn)值為 false,使用 L1 范數(shù)來計算梯度。

Part33. ?邊緣檢測的三大準(zhǔn)則

John F. 在提出 Canny 算子的同時,提出了邊緣檢測的三大準(zhǔn)則:

  • 低錯誤率的邊緣檢測:檢測算法應(yīng)該精確地找到圖像中的盡可能多的邊緣,盡可能的減少漏檢和誤檢。

  • 最優(yōu)定位:檢測的邊緣點(diǎn)應(yīng)該精確地定位于邊緣的中心。

  • 圖像中的任意邊緣應(yīng)該只被標(biāo)記一次,同時圖像噪聲不應(yīng)產(chǎn)生偽邊緣。

Canny 邊緣檢測算法正是遵循了這些準(zhǔn)則。

Part44. 各個算子的關(guān)系

將之前介紹的幾種算子,整理一下他們的關(guān)系:

  • Roberts 算子和 Prewitt 算子是基礎(chǔ)算子,Sobel 算子是它們的擴(kuò)展。

  • Laplace 算子是二階導(dǎo)數(shù)算子,可以計算圖像的梯度二階導(dǎo)數(shù)。

  • LoG 算子和 DoG 算子是帶高斯核的微分算子,可以抑制噪聲。

  • Canny 邊緣檢測算法是綜合使用了高斯濾波、 Sobel 算子、非極大值抑制和雙閾值檢測的邊緣檢測算法。

Part55. ?總結(jié)

本文介紹了 Canny 算子的特點(diǎn)以及如何一步步實(shí)現(xiàn)一個 Canny 的函數(shù)。并且,在最后總結(jié)了之前介紹的幾種算子的關(guān)系。

Java與Android技術(shù)?!抗娞?/strong>

關(guān)注?Java/Kotlin 服務(wù)端、桌面端 、Android 、機(jī)器學(xué)習(xí)、端側(cè)智能

更多精彩內(nèi)容請關(guān)注:文章來源地址http://www.zghlxwxcb.cn/news/detail-770245.html

到了這里,關(guān)于OpenCV 筆記(12):常用的邊緣檢測算子—— Canny的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Canny算子邊緣檢測原理講解及其完整C語言實(shí)現(xiàn)(不使用opencv)

    Canny算子邊緣檢測原理講解及其完整C語言實(shí)現(xiàn)(不使用opencv)

    作者:隊(duì)友調(diào)車我吹空調(diào) 日期:2023/05/17 版權(quán):遵循CC 4.0 BY-SA版權(quán)協(xié)議 這里是后期的筆者,本文算是筆者的學(xué)習(xí)筆記,主要是在單片機(jī)中使用的,再者就是由于某些原因,筆者不想使用opencv,因此嘗試跟著原理手搓了這份代碼,筆者也盡力將代碼寫到最簡和效率最優(yōu)了。然而

    2024年04月27日
    瀏覽(21)
  • python --opencv圖像處理Canny算子邊緣檢測(Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr 算子、 LOG 算子)

    python --opencv圖像處理Canny算子邊緣檢測(Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr 算子、 LOG 算子)

    邊緣檢測是基于灰度突變來分割圖像的常用方法,其實(shí)質(zhì)是提取圖像中不連續(xù)部分的特征。目前常見邊緣檢測算子有差分算子、 Roberts 算子、 Sobel 算子、 Prewitt 算子、 Log 算子以及 Canny 算子等。 其中, Canny 算子是由計算機(jī)科學(xué)家 John F. Canny 于 1986 年提出的一種邊緣檢測算子

    2024年04月12日
    瀏覽(26)
  • openCV實(shí)戰(zhàn)-系列教程5:邊緣檢測(Canny邊緣檢測/高斯濾波器/Sobel算子/非極大值抑制/線性插值法/梯度方向/雙閾值檢測 )、原理解析、源碼解讀
?????OpenCV實(shí)戰(zhàn)系列總目錄

    openCV實(shí)戰(zhàn)-系列教程5:邊緣檢測(Canny邊緣檢測/高斯濾波器/Sobel算子/非極大值抑制/線性插值法/梯度方向/雙閾值檢測 )、原理解析、源碼解讀 ?????OpenCV實(shí)戰(zhàn)系列總目錄

    打印一個圖片可以做出一個函數(shù): Canny是一個科學(xué)家在1986年寫了一篇論文,所以用自己的名字來命名這個檢測算法,Canny邊緣檢測算法這里寫了5步流程,會用到之前《openCV實(shí)戰(zhàn)-系列教程》的內(nèi)容。? 使用高斯濾波器,以平滑圖像,濾除噪聲。 計算圖像中每個像素點(diǎn)的梯度強(qiáng)

    2024年02月11日
    瀏覽(22)
  • OpenCV自學(xué)筆記十四:Canny邊緣檢測

    Canny邊緣檢測是一種經(jīng)典的圖像邊緣檢測算法,具有以下幾個步驟: 1. 噪聲抑制:首先對圖像進(jìn)行平滑處理,以去除圖像中的噪聲。常用的方法是應(yīng)用高斯濾波器。 2. 計算梯度:通過對平滑后的圖像應(yīng)用Sobel算子(或其他梯度算子),計算圖像的梯度幅值和梯度方向。梯度表

    2024年02月08日
    瀏覽(20)
  • python實(shí)現(xiàn)Canny算子邊緣檢測算法

    python實(shí)現(xiàn)Canny算子邊緣檢測算法

    ? ? 邊緣檢測是一種將圖片中關(guān)鍵信息表現(xiàn)出來的一種圖片技術(shù),它的結(jié)果并不是字面意思上的獲取圖片邊緣,而是將圖片有用的信息勾勒出來,類似素描的結(jié)果,但是已經(jīng)去掉了很多信息。如下所示,一張?jiān)嫉膱D片是這樣的: ? ?? ? ? 通過邊緣檢測算法,我們最終得到

    2024年02月08日
    瀏覽(22)
  • Canny邊緣檢測算子原理和matlab實(shí)現(xiàn)代碼

    ??圖像邊緣是圖像的重要信息,而Canny算子則是用于邊緣檢測的經(jīng)典算法。在用Canny算子進(jìn)行邊緣檢測之前必須有效地抑制噪聲,該算法使用的是高斯平滑濾波。接下來計算圖像中每一點(diǎn)的梯度向量,根據(jù)梯度向量可以得到梯度方向和梯度幅值。梯度方向在(-π,π]范圍內(nèi),

    2023年04月09日
    瀏覽(27)
  • Halcon邊緣檢測Sobel、Laplace和Canny算子

    Halcon邊緣檢測Sobel、Laplace和Canny算子

    提示:文章參考了網(wǎng)絡(luò)上其他作者的文章,以及相關(guān)書籍,如有侵權(quán),請聯(lián)系作者。 ???????除了閾值分割外,也可以通過檢測區(qū)域的邊緣得到目標(biāo)區(qū)域。區(qū)域的邊緣像素的灰度值往往會發(fā)生灰度上的突變,針對這些跳躍性的突變進(jìn)行檢測和計算,可以得到區(qū)域的邊緣輪廓

    2023年04月08日
    瀏覽(19)
  • Halcon經(jīng)典的邊緣檢測算子Sobel/Laplace/Canny

    關(guān)于邊緣檢測,有許多經(jīng)典的算子,各大圖形處理庫都有各自的邊緣檢測算子,這里簡要介紹幾種。 Sobel算子結(jié)合了高斯平滑和微分求導(dǎo)。它是一階導(dǎo)數(shù)的邊緣檢測算子,使用卷積核對圖像中的每個像素點(diǎn)做卷積和運(yùn)算,然后采用合適的閾值提取邊緣。Soble算子有兩個卷積核

    2024年01月22日
    瀏覽(21)
  • OpenCV——Canny邊緣檢測算法

    OpenCV——Canny邊緣檢測算法

    圖像分割是將數(shù)字圖像細(xì)分為多個子區(qū)域的過程,在計算機(jī)視覺/機(jī)器視覺領(lǐng)域被廣泛應(yīng)用。它的目的是簡化或改變圖像的表示形式,以便更容易理解和分析。常見的圖像分割方法包括閾值處理、聚類法、邊緣檢測和區(qū)域生長等。解決圖像分割問題通常需要結(jié)合領(lǐng)域知識,以提

    2024年04月17日
    瀏覽(27)
  • 《opencv實(shí)用探索·十一》opencv之Prewitt算子邊緣檢測,Roberts算子邊緣檢測和Sobel算子邊緣檢測

    《opencv實(shí)用探索·十一》opencv之Prewitt算子邊緣檢測,Roberts算子邊緣檢測和Sobel算子邊緣檢測

    1、前言 邊緣檢測: 圖像邊緣檢測是指在圖像中尋找灰度、顏色、紋理等變化比較劇烈的區(qū)域,它們可能代表著物體之間的邊界或物體內(nèi)部的特征。邊緣檢測是圖像處理中的一項(xiàng)基本操作,可以用于人臉識別、物體識別、圖像分割等多個領(lǐng)域。 邊緣檢測實(shí)質(zhì)上是計算當(dāng)前點(diǎn)和

    2024年02月22日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包