圖像梯度處理與邊緣檢測

在圖像處理的世界里,我們常常需要從復雜的像素矩陣中提取有意義的信息 —— 比如一張照片中物體的輪廓、醫學影像中病灶的邊界、自動駕駛視野里的道路邊緣。這些 “邊界” 或 “輪廓” 在專業術語中被稱為 “邊緣”,而捕捉邊緣的核心技術,離不開對 “圖像梯度” 的理解與處理。

目錄

一、圖像梯度

1. 梯度的數學基礎:從偏導數到梯度向量

2. 梯度處理:用算子捕捉變化

Sobel算子

Laplacian算子

二、邊緣檢測:從梯度到清晰邊界

1. 邊緣檢測的前提:降噪處理

2. 計算圖像的梯度與方向

3.非極大值抑制

4.雙閾值篩選

5.API的使用

三、理論到實踐:梯度與邊緣檢測的應用

總結


一、圖像梯度

想要理解邊緣檢測,首先要抓住 “梯度” 這個核心概念。在數學中,梯度是描述函數變化率的向量,它既包含變化的 “大小”(強度),也包含變化的 “方向”。而在圖像中,每個像素的灰度值(或 RGB 值)可以看作是一個二維函數,圖像梯度就是這個函數在像素層面的變化率

1. 梯度的數學基礎:從偏導數到梯度向量

圖像是由離散的像素組成的二維網格,假設我們用f(x,y)表示坐標f(x,y)處的灰度值(0-255,黑色到白色)。那么:

  • 橫向梯度(x 方向):用偏導數\frac{\partial f}{\partial x}表示,描述像素在水平方向的灰度變化率(比如從左到右變亮或變暗);
  • 縱向梯度(y 方向):用偏導數\frac{\partial f}{\partial y}表示,描述像素在垂直方向的灰度變化率(比如從上到下的灰度突變)。

梯度向量則是由這兩個偏導數組成的向量(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}),它的大小(模長)表示灰度變化的 “劇烈程度”,方向則指向灰度增長最快的方向 —— 這正是邊緣的核心特征:邊緣處的灰度變化往往最劇烈,梯度大小也最大。

2. 梯度處理:用算子捕捉變化

在實際計算中,圖像是離散的,無法直接求偏導數,因此需要用 “算子”(即小矩陣)通過卷積運算近似計算梯度。常用的梯度算子有以下幾種:

Sobel算子

sobel算子常被用在圖像的垂直方向邊緣提取或水平方向邊緣提取,如果你還記得高數中用一階導數來求極值的話,就很容易理解了:把圖片想象成連續函數,因為邊緣部分的像素值是與旁邊像素明顯有區別的,所以對圖片局部求極值,就可以得到整幅圖片的邊緣信息了。不過圖片是二維的離散函數,導數就變成了差分,{\frac{\partial f}{\partial x}}=f(x+1)-f(x)這個差分就稱為圖像的梯度。sobel算子本質就是一階導數求極值。所以只適用于二維的邊緣,對垂直和平行一起提取,效果不好。

比較常用的sobel垂直邊緣提取:k1=\left[\begin{array}{c c c}{?{-1}}&{?{0}}&{?{1}}\\ {?{-2}}&{?{0}}&{?{2}}\\ {?{-1}}&{?{0}}&{?{1}}\end{array}\right],水平:k2=\left[\begin{array}{c c c}{?{-1}}&{?{-2}}&{?{-1}}\\ {?{0}}&{?{0}}&{?{0}}\\ {?{1}}&{?{2}}&{?{1}}\end{array}\right]


但sobel算子的卷積核中的值沒有明確規定你可以用你自己的。比如,最初只利用鄰域間的原始差值來檢測邊緣的Prewitt算子:
k=\left[{\begin{array}{r r r}{-1}&{0}&{1}\\ {-1}&{0}&{1}\\ {-1}&{0}&{1}\end{array}}\right]
還有比Sobel更好用的Scharr算子,大家可以了解下:
k=\left[{\begin{array}{r r r}{-3}&{0}&{3}\\ {-10}&{0}&{10}\\ {-3}&{0}&{3}\end{array}}\right]
?

sobel算子的API:sobel_image = cv2.Sobel(src, ddepth, dx, dy, ksize)

src:這是輸入圖像,通常應該是一個灰度圖像(單通道圖像),因為 Sobel 算子是基于像素亮度梯度計算的。在彩色圖像的情況下,通常需要先將其轉換為灰度圖像。

ddepth:這個參數代表輸出圖像的深度,即輸出圖像的數據類型。在 OpenCV 中,-1 表示輸出圖像的深度與輸入圖像相同。

dx,dy:當組合為dx=1,dy=0時求x方向的一階導數,在這里,設置為1意味著我們想要計算圖像在水平方向(x軸)的梯度。當組合為 dx=0,dy=1時求y方向的一階導數(如果同時為1,通常得不到想要的結果,想兩個方向都處理的比較好 學習使用后面的算子)

ksize:Sobel算子的大小,可選擇3、5、7,默認為3。

Laplacian算子

Laplacian算子就是與sobel算子不一樣的層面,一維的二階差分公式

{\frac{\partial^{2}f}{\partial x^{2}}}=f(x+1)+f(x-1)-2f(x)

而對于二維函數f(x,y),兩個方向的二階差分分別是:

{\frac{\partial^{2}f}{\partial x^{2}}}=f(x+1,y)+f(x-1,y)-2f(x,y)
{\frac{\partial^{2}f}{\partial y^{2}}}=f(x,y+1)+f(x,y-1)-2f(x,y)

合在一起就是:

V^{2}f(x,y)=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)

提取前面提到的系數就能得到二維的Laplacion濾波核:????????k=\left[\begin{array}{c c c}{0}&{1}&{0}\\ {1}&{-4}&{1}\\ {0}&{1}&{0}\end{array}\right]

這就是Laplacian算子的圖像卷積模板,有些資料中在此基礎上考慮斜對角情況,將卷積核拓展為:????????k=\left[\begin{array}{c c c}{1}&{1}&{1}\\ {1}&{-8}&{1}\\ {1}&{1}&{1}\end{array}\right]

Laplacion的API:
cv2.Laplacian(src, ddepth)

src:這是輸入圖像

ddepth:這個參數代表輸出圖像的深度,即輸出圖像的數據類型。在 OpenCV 中,-1 表示輸出圖像的深度與輸入圖像相同。

這些算子的工作原理可以將核簡單理解為 “滑動窗口”:用一個 3x3 的矩陣在圖像上逐像素滑動,將窗口內的像素與算子矩陣的數值相乘后求和,結果就是該像素的梯度大小(橫向或縱向)。例如,Sobel 算子的橫向矩陣會突出水平方向的灰度變化(即垂直邊緣),縱向矩陣則突出垂直方向的灰度變化(即水平邊緣)。

二、邊緣檢測:從梯度到清晰邊界

邊緣是圖像中灰度值劇烈變化的區域(比如物體與背景的交界處),而梯度的大小直接反映了這種變化的 “劇烈程度”—— 梯度越大,越可能是邊緣。因此,邊緣檢測的核心邏輯就是:通過梯度處理找到梯度值超過閾值的像素,將其標記為邊緣。但實際操作中,邊緣檢測遠比 “找大梯度” 復雜,因為噪聲會干擾梯度計算(噪聲的灰度突變會被誤判為邊緣),且邊緣往往是連續的線條,需要進一步優化。

1. 邊緣檢測的前提:降噪處理

梯度對噪聲極其敏感,一個孤立的噪聲點(比如椒鹽噪聲)會導致局部梯度驟增,被誤判為邊緣。因此,邊緣檢測的第一步通常是降噪預處理,最常用的方法是 “高斯模糊”:用高斯函數對圖像進行平滑處理,削弱高頻噪聲(灰度突變),同時保留低頻邊緣信息(較大范圍的灰度變化)。

2. 計算圖像的梯度與方向

這里使用了sobel算子來計算圖像的梯度值, 首先使用sobel算子計算中心像素點的兩個方向上的梯度G_{x}G_{y},然后就能夠得到其具體的梯度值:
?????????????????????????????????????????????????????????????????????????????????????G={\sqrt{G_{x}{}^{2}+G_{y}{}^{2}}}

也可以使用G=|G_{x}+G_{y}|來代替。在OpenCV中,默認使用G=|G_{x}+G_{y}|來計算梯度值。

然后我們根據如下公式可以得到一個角度值:{\frac{G_{\mathrm{y}}}{G_{x}}}=\tan\,(\theta)
????????????????????????????????????????????????\theta=\arctan\,({\frac{G_{\mathrm{y}}}{G_{x}}})

這個角度值其實是當前邊緣的梯度的方向。通過這個公式我們就可以計算出圖片中所有的像素點的梯度值與梯度方向,然后根據梯度方向獲取邊緣的方向。

a). 并且如果梯度方向不是0°、45°、90°、135°這種特定角度,那么就要用到插值算法來計算當前像素點在其方向上進行插值的結果了,然后進行比較并判斷是否保留該像素點。這里使用的是單線性插值,通過A1和A2兩個像素點獲得dTmp1與dTmp2處的插值,然后與中心點C進行比較(非極大值抑制)。如下左圖

b). 得到\theta的值之后,就可以對邊緣方向進行分類,為了簡化計算過程,OpenCV一般將其歸為四個方向:水平方向、垂直方向、45°方向、135°方向。如右圖,并且:

\theta值為-22.5°~22.5°,或-157.5°~157.5°,則認為邊緣為水平邊緣;

當法線方向為22.5°~67.5°,或-112.5°~-157.5°,則認為邊緣為45°邊緣;

當法線方向為67.5°~112.5°,或-67.5°~-112.5°,則認為邊緣為垂直邊緣;

當法線方向為112.5°~157.5°,或-22.5°~-67.5°,則認為邊緣為135°邊緣;

3.非極大值抑制

得到每個邊緣的方向之后,其實把它們連起來邊緣檢測就算完了,但是為什么還有這一步與下一步呢?是因為經過第二步得到的邊緣不經過處理是沒辦法使用的,因為高斯濾波的原因,邊緣會變得模糊,導致經過第二步后得到的邊緣像素點非常多,因此我們需要對其進行一些過濾操作,而非極大值抑制就是一個很好的方法,它會對得到的邊緣像素進行一個排除,使邊緣盡可能細一點。

在該步驟中,我們需要檢查每個像素點的梯度方向上的相鄰像素,并保留梯度值最大的像素,將其他像素抑制為零。假設當前像素點為(x,y),其梯度方向是0°,梯度值為G(x,y),那么我們就需要比較G(x,y)與兩個相鄰像素的梯度值:G(x-1,y)和G(x+1,y)。如果G(x,y)是三個值里面最大的,就保留該像素值,否則將其抑制為零。

4.雙閾值篩選

經過非極大值抑制之后,我們還需要設置閾值來進行篩選,當閾值設的太低,就會出現假邊緣,而閾值設的太高,一些較弱的邊緣就會被丟掉,因此使用了雙閾值來進行篩選,推薦高低閾值的比例為2:1到3:1之間,其原理如下圖所示:

當某一像素位置的幅值超過最高閾值時,該像素必是邊緣像素;當幅值低于最低像素時,該像素必不是邊緣像素;幅值處于最高像素與最低像素之間時,如果它能連接到一個高于閾值的邊緣時,則被認為是邊緣像素,否則就不會被認為是邊緣。也就是說,上圖中的A和C是邊緣,B不是邊緣。因為C雖然不超過最高閾值,但其與A相連,所以C就是邊緣。


注:雙閾值篩選所設置的閾值不是像素值,而是梯度值的閾值

5.API的使用

edges = cv2.Canny(image, threshold1, threshold2),即使讀到的是彩色圖也可以進行處理。

  • image:輸入的灰度/二值化圖像數據。

  • threshold1:低閾值,用于決定可能的邊緣點。

  • threshold2:高閾值,用于決定強邊緣點。
    ?

三、理論到實踐:梯度與邊緣檢測的應用

圖像梯度處理和邊緣檢測是許多高級圖像處理任務的基石,其應用遍布各行各業:

  • 目標識別與追蹤:在自動駕駛中,通過檢測道路邊緣、車輛輪廓的邊緣,幫助車輛判斷行駛邊界和障礙物位置;
  • 醫學影像分析:在 CT 或 MRI 圖像中,邊緣檢測可定位腫瘤、血管的邊界,輔助醫生診斷;
  • 圖像分割:將圖像按邊緣劃分為不同區域(如前景與背景),為后續處理提供基礎;
  • 工業檢測:通過檢測產品表面的邊緣缺陷(如裂縫、劃痕),實現自動化質量控制。

總結

圖像梯度是描述像素灰度變化的 “數學工具”,而邊緣檢測則是基于梯度尋找圖像中 “有意義邊界” 的技術。從簡單的 Sobel 算子到復雜的 Canny 算法,每一種方法都在平衡精度、效率與抗噪聲能力。理解梯度與邊緣檢測的原理,主要在于理解為什么梯度處理使用數學中的一階方差和二階方差且卷積核如何發揮作用,邊緣檢測主要在于邊緣方向不一定會是常見的45,90等,如何確認圖像的梯度和方向就是需要重點理解的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916120.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GPU服務器與PC 集群(PC農場):科技算力雙子星

在數字經濟高速發展的今天,算力已成為驅動科技創新與產業變革的核心引擎。GPU服務器憑借其強大的并行計算能力,在圖形渲染、人工智能訓練等領域展現出不可替代的優勢;而PC集群則通過分布式架構,以高性價比和靈活擴展特性&#xff…

秋招Day19 - 分布式 - 分布式鎖

單體時代,可以直接用本地鎖來實現對競爭資源的加鎖,分布式環境下就要用到分布式鎖了有哪些分布式鎖的實現方案?MySQL分布式鎖、Zookeeper分布式鎖、Redis分布式鎖MySQL分布式鎖如何實現?創建一張鎖表,對字段定義唯一性…

AIStarter平臺亮點解析:從ComfyUI項目上架到一鍵運行的完整指南

大家好!今天分享一個AIStarter平臺的深度體驗,帶你了解如何通過這個平臺輕松上架和運行AI項目!視頻中,博主在凌晨分享了AIStarter的強大功能,重點展示了ComfyUI 4.0和5.0整合包的上架過程,以及如何簡化AI項…

電腦錄屏軟件推薦:如何使用oCam錄制游戲、教程視頻

在工作、學習或游戲過程中,我們經常需要錄制電腦屏幕,比如制作教程視頻、記錄游戲操作、分享軟件使用過程等。oCam 是一款功能強大且操作簡單的屏幕錄制工具,支持 Windows 系統,深受用戶喜愛。今天簡鹿辦公就來手把手教你如何使用…

安裝cuml報錯

安裝命令 (注意cuda的版本) pip install --no-cache-dir --extra-index-urlhttps://pypi.nvidia.com cuml-cu11 報錯: 找了很多網上的教程 1.版本問題 沒解決 pip install --upgrade pip pip install --upgrade setuptools 2.參考下面博…

【ECharts?】解決Vue 中 v-show 導致組件 ECharts 樣式異常問題

解決Vue 中 v-show 導致組件 ECharts 樣式異常問題 問題概述 在使用 Vue 的 v-show 指令實現 <PageOne/>、<PageTwo/>、<PageThree/> 三個視圖的定時切換時&#xff0c;<PageTwo/> 顯示時出現了異常&#xff0c;具體表現為 ECharts 圖表渲染圖表尺寸異…

旅游管理虛擬仿真實訓室:重構實踐教學新生態

在旅游產業數字化轉型與教育信息化深度融合的背景下&#xff0c;旅游管理虛擬仿真實訓室成為連接理論教學與行業實踐的關鍵紐帶。它通過沉浸式技術還原旅游場景&#xff0c;解決傳統實訓中資源受限、風險較高、時空局限等問題&#xff0c;為旅游管理專業人才培養提供全新路徑。…

【在線五子棋對戰】十、對戰玩家匹配管理模塊

文章目錄前言Ⅰ. 匹配隊列實現Ⅱ. 匹配隊列管理類實現完整代碼前言 五子棋對戰的玩家匹配是根據自己的天梯分數進行匹配的&#xff0c;而服務器中將玩家天梯分數分為三個檔次&#xff1a; 青銅&#xff1a;天梯分數小于 2000 分白銀&#xff1a;天梯分數介于 2000~3000 分之間…

k8s之ingress定義https訪問方式

接上文&#xff1a;https://blog.csdn.net/soso678/article/details/149607069?spm1001.2014.3001.5502定義后端應用與service [rootmaster ingress]# cat my-nginx.yml apiVersion: apps/v1 kind: Deployment metadata:name: my-nginx spec:selector:matchLabels:run: my-n…

《C++ vector 完全指南:vector的模擬實現》

《C vector 完全指南&#xff1a;vector的模擬實現》 文章目錄《C vector 完全指南&#xff1a;vector的模擬實現》一、定義vector的成員變量二、用vector實現動態二維數組三、vector的接口實現1.vector的默認成員函數&#xff08;1&#xff09;構造函數實現&#xff08;2&…

騰訊云代碼助手使用指南

騰訊云代碼助手使用指南什么是騰訊云代碼助手功能區展示功能介紹功能演示一、創建新項目1.先用Chat 把口語化的需求轉換成AI更容易接受的結構化提示詞2.再用Craft 模式進行代碼生成3.成果展示二、老項目探索1.使用Codebase 幫理解項目代碼三、代碼補全1.只需輸入標準的函數名&a…

【vue3+vue-pdf-embed】實現PDF+圖片預覽

【vue3vue-pdf-embed】實現PDF圖片預覽項目背景項目代碼分析代碼項目背景 技術棧&#xff1a;vue3Tselementplus 需要實現PDF和圖片預覽 圖片預覽很好解決了&#xff0c;可以用elementplus 自帶的組件el-image 可實現 PDF預覽可以用搜了一圈&#xff0c;有兩個方案&#xff0c…

Leetcode力扣解題記錄--第21題(合并鏈表)

題目鏈接&#xff1a;21. 合并兩個有序鏈表 - 力扣&#xff08;LeetCode&#xff09; 題目描述 將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例 1&#xff1a; 輸入&#xff1a;l1 [1,2,4], l2 [1,3,4] 輸出&…

基于單片機的樓宇門禁系統的設計與實現

2、系統總體設計 2.1硬件的總體設計 為了使門禁系統智能化&#xff0c;需要一個主控芯片對整個門禁系統進行管理控制。接著還需要對應的模塊完成包括數字密碼驗證和IC卡識別驗證的功能。當出現非法闖入、驗證失敗等情況時還需要對操作人員進行警告。最后需要一個人機交互界面方…

全天候自動化數字型智能驅鳥裝置,電網防鳥高科技

鳥類在輸電線路鐵塔、電線桿上筑巢、棲息和排泄是個大問題&#xff0c;很容易引發線路故障導致停電。為了保障電網安全穩定運行&#xff0c;會用到各種智能驅鳥裝置來驅趕鳥類&#xff0c;避免涉鳥故障發生。例如全天候自動化數字型智能驅鳥裝置&#xff0c;其厲害的地方在于它…

技術、生態與商業:從PC到移動的平臺之爭

在科技發展的漫長歷史中&#xff0c;我們常常驚嘆于那些改變世界的偉大技術。然而&#xff0c;深入探究會發現&#xff0c;單純的技術領先并不能保證最終的勝利。從 PC 操作系統到移動終端&#xff0c;乃至服務器軟件&#xff0c;那些最終笑傲江湖的巨頭們都遵循著一個共同的法…

android JXL 導出Excel(.xls/xlsx)

前面使用過 POI 導出xlsx但是它體量比較大&#xff0c;功能較豐富&#xff0c;在一些對包size比較敏感并且導出需求相對簡單的項目中就不太適合。 poi鏈接&#xff1a;Android 導入導出excel xls、xlsx_android excel導入導出-CSDN博客 jxl 包體積小&#xff0c;使用簡單、AP…

mysql 的主從機制是怎么實現的?

MySQL 作為當前最流行的開源關系型數據庫之一&#xff0c;為了滿足數據的高可用、負載均衡和容災備份等需求&#xff0c;廣泛應用主從復制&#xff08;Replication&#xff09;機制。其核心思想是&#xff1a;在一臺主庫&#xff08;Master&#xff09;上發生的所有數據變更都會…

【PHP 函數從入門到精通】

&#x1f9e0; PHP 函數從入門到精通 PHP 函數是編程中最基礎、也是最強大的工具之一。它不僅可以簡化代碼、提高復用性&#xff0c;還能通過各種高級用法&#xff0c;讓你寫出更靈活、更現代的代碼。 下面我們從函數的基礎講起&#xff0c;逐步深入&#xff0c;帶你掌握函數的…

CGA老年綜合評估漢密爾頓抑郁量表與認知評估聯用

一、CGA老年綜合評估漢密爾頓抑郁量表與認知評估聯用的基礎CGA老年綜合評估 &#xff08;一&#xff09;二者評估內容的互補性 CGA老年綜合評估漢密爾頓抑郁量表主要聚焦于老年人的抑郁情緒及相關癥狀&#xff0c;而認知評估則著重考察老年人的記憶力、注意力、思維能力等認知…