圖像識別邊緣算法

文章目錄

    • 1. 基本概念
    • 2. 邊緣檢測原理
      • 邊緣類型:
    • 3. 常見邊緣檢測算法
      • 3.1 Sobel算子
      • 3.2 Canny邊緣檢測
      • 3.3 Laplacian算子
    • 4. Canny邊緣檢測詳細流程
      • 流程圖示例:
      • 詳細步驟說明:
    • 5. 邊緣檢測算法比較
    • 6. 參數調優建議
      • Canny邊緣檢測參數:
      • Sobel算子參數:
    • 8. 實際應用場景
      • 8.1 醫學圖像處理
      • 8.2 工業檢測
      • 8.3 自動駕駛
      • 8.4 安防監控

1. 基本概念

邊緣檢測是圖像處理和計算機視覺中的基礎技術,用于識別圖像中物體的邊界。邊緣是指圖像中像素強度發生急劇變化的區域,通常對應于物體的輪廓、紋理變化或光照變化。

2. 邊緣檢測原理

邊緣檢測的基本原理是通過計算圖像中像素的梯度來檢測邊緣。梯度表示像素強度變化的速率和方向。在邊緣處,像素強度會發生顯著變化,因此梯度值會很大。

邊緣類型:

  • 階躍邊緣:像素強度突然變化
  • 屋頂邊緣:像素強度逐漸變化后恢復
  • 線條邊緣:細線狀結構

3. 常見邊緣檢測算法

3.1 Sobel算子

Sobel算子是一種基于梯度的邊緣檢測算法,通過計算圖像在水平和垂直方向上的梯度來檢測邊緣。

import cv2
import numpy as np
import matplotlib.pyplot as pltdef sobel_edge_detection(image):"""使用Sobel算子進行邊緣檢測"""# 轉換為灰度圖像if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image# 計算x和y方向的梯度sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)# 計算梯度幅值sobel_combined = np.sqrt(sobelx**2 + sobely**2)return sobelx, sobely, sobel_combined# 示例使用
# image = cv2.imread('sample.jpg')
# sobelx, sobely, sobel_combined = sobel_edge_detection(image)

3.2 Canny邊緣檢測

Canny邊緣檢測是一種多階段算法,被認為是邊緣檢測的黃金標準。

def canny_edge_detection(image, low_threshold=50, high_threshold=150):"""使用Canny算法進行邊緣檢測"""# 轉換為灰度圖像if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image# 應用高斯濾波去噪blurred = cv2.GaussianBlur(gray, (5, 5), 0)# Canny邊緣檢測edges = cv2.Canny(blurred, low_threshold, high_threshold)return edges# 示例使用
# edges = canny_edge_detection(image)

3.3 Laplacian算子

Laplacian算子是二階導數算子,對噪聲敏感但能檢測到更精細的邊緣。

def laplacian_edge_detection(image):"""使用Laplacian算子進行邊緣檢測"""# 轉換為灰度圖像if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image# 應用高斯濾波去噪blurred = cv2.GaussianBlur(gray, (3, 3), 0)# Laplacian邊緣檢測laplacian = cv2.Laplacian(blurred, cv2.CV_64F)return laplacian

4. Canny邊緣檢測詳細流程

Canny邊緣檢測算法包含以下幾個步驟:

流程圖示例:

原始圖像↓
轉換為灰度圖像↓
高斯濾波去噪↓
計算梯度幅值和方向↓
非極大值抑制↓
雙閾值檢測↓
邊緣連接(滯后閾值)↓
最終邊緣圖像

詳細步驟說明:

  1. 灰度化:將彩色圖像轉換為灰度圖像
  2. 噪聲去除:使用高斯濾波器平滑圖像
  3. 梯度計算:計算每個像素的梯度幅值和方向
  4. 非極大值抑制:細化邊緣,使邊緣只有一個像素寬
  5. 雙閾值檢測:使用高低閾值確定強邊緣和弱邊緣
  6. 邊緣連接:通過滯后閾值連接邊緣
def detailed_canny_process(image):"""詳細展示Canny邊緣檢測的每個步驟"""# 步驟1: 轉換為灰度圖像if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image# 步驟2: 高斯濾波去噪blurred = cv2.GaussianBlur(gray, (5, 5), 1.4)# 步驟3: 計算梯度# 使用Sobel算子計算梯度grad_x = cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize=3)grad_y = cv2.Sobel(blurred, cv2.CV_64F, 0, 1, ksize=3)# 計算梯度幅值和方向magnitude = np.sqrt(grad_x**2 + grad_y**2)angle = np.arctan2(grad_y, grad_x)# 步驟4: 非極大值抑制suppressed = non_maximum_suppression(magnitude, angle)# 步驟5: 雙閾值檢測weak = 50strong = 150thresholded = double_threshold(suppressed, weak, strong)# 步驟6: 邊緣連接edges = hysteresis(thresholded, weak, strong)return edgesdef non_maximum_suppression(magnitude, angle):"""非極大值抑制"""rows, cols = magnitude.shapesuppressed = np.zeros((rows, cols), dtype=np.int32)angle = angle * 180. / np.piangle[angle < 0] += 180for i in range(1, rows-1):for j in range(1, cols-1):try:q = 255r = 255# 角度0度if (0 <= angle[i,j] < 22.5) or (157.5 <= angle[i,j] <= 180):q = magnitude[i, j+1]r = magnitude[i, j-1]# 角度45度elif (22.5 <= angle[i,j] < 67.5):q = magnitude[i+1, j-1]r = magnitude[i-1, j+1]# 角度90度elif (67.5 <= angle[i,j] < 112.5):q = magnitude[i+1, j]r = magnitude[i-1, j]# 角度135度elif (112.5 <= angle[i,j] < 157.5):q = magnitude[i-1, j-1]r = magnitude[i+1, j+1]if (magnitude[i,j] >= q) and (magnitude[i,j] >= r):suppressed[i,j] = magnitude[i,j]else:suppressed[i,j] = 0except IndexError as e:passreturn suppresseddef double_threshold(img, weak, strong):"""雙閾值檢測"""high_threshold = img.max() * 0.2low_threshold = high_threshold * 0.05rows, cols = img.shaperesult = np.zeros((rows, cols), dtype=np.int32)weak_i, weak_j = np.where((img <= high_threshold) & (img >= low_threshold))strong_i, strong_j = np.where(img >= high_threshold)result[strong_i, strong_j] = strongresult[weak_i, weak_j] = weakreturn resultdef hysteresis(img, weak, strong):"""邊緣連接(滯后閾值)"""rows, cols = img.shapefor i in range(1, rows-1):for j in range(1, cols-1):if (img[i,j] == weak):try:if ((img[i+1, j-1] == strong) or (img[i+1, j] == strong) or (img[i+1, j+1] == strong)or (img[i, j-1] == strong) or (img[i, j+1] == strong)or (img[i-1, j-1] == strong) or (img[i-1, j] == strong) or (img[i-1, j+1] == strong)):img[i, j] = strongelse:img[i, j] = 0except IndexError as e:passreturn img

5. 邊緣檢測算法比較

算法優點缺點適用場景
Sobel計算簡單,對噪聲有一定抑制作用邊緣較粗,定位不夠精確實時應用,對精度要求不高的場景
Canny檢測精度高,邊緣連續性好計算復雜,參數敏感高精度邊緣檢測需求
Laplacian能檢測到細小邊緣對噪聲敏感需要檢測細節特征的場景
Prewitt計算簡單,各向同性對噪聲敏感,邊緣較粗簡單的邊緣檢測任務

6. 參數調優建議

Canny邊緣檢測參數:

  • 低閾值:通常設為高閾值的0.4-0.5倍
  • 高閾值:可根據圖像的噪聲水平調整
  • 高斯核大小:一般選擇3x3或5x5

Sobel算子參數:

  • 核大小:通常選擇3x3,也可選擇5x5以獲得更大范圍的梯度

8. 實際應用場景

8.1 醫學圖像處理

  • 腫瘤邊界檢測
  • 器官輪廓識別
  • 細胞結構分析

8.2 工業檢測

  • 產品質量檢測
  • 缺陷識別
  • 尺寸測量

8.3 自動駕駛

  • 車道線檢測
  • 行人和車輛識別
  • 交通標志識別

8.4 安防監控

  • 運動目標檢測
  • 人臉識別預處理
  • 行為分析

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

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

相關文章

【Java Web實戰】從零到一打造企業級網上購書網站系統 | 完整開發實錄(終)

&#x1f9ea; 測試與質量保證 &#x1f50d; 全方位測試體系 我建立了企業級的全方位測試體系來確保系統質量&#xff1a; &#x1f9ea; 測試金字塔模型 #mermaid-svg-u4I8UuUAyxJVjcqs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…

QT開發---網絡編程下

HTTP協議 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是互聯網上應用最為廣泛的協議之一&#xff0c;用于客戶端和服務器之間的通信。默認端口80&#xff0c;傳輸層使用的是TCP協議特點無連接&#xff1a;HTTP協議是無連接的&#xff…

mac 蘋果電腦 Intel 芯片(Mac X86) 安卓虛擬機 Android模擬器 的救命稻草(下載安裝指南)

引言&#xff1a; 還在為你的Intel芯片MacBook&#xff08;i5, i7, i9等&#xff09;找不到合適的安卓虛擬機而發愁嗎&#xff1f;隨著Apple Silicon (M1/M2/M3) 芯片的普及&#xff0c;大量優秀的安卓模擬器&#xff08;如Android Studio自帶的模擬器、網易MuMu等&#xff09;…

C語言:順序表(上)

C語言&#xff1a;順序表&#xff08;上&#xff09; 1.順序表的介紹 2.順序表的實現 1.順序表的介紹 線性表是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構&#xff0c;常見的線性表&#xff1a;順序表、鏈表、棧、隊列、字符串… 線性表在…

GPT - 5被曝將在8月初發布!并同步推出mini、nano版

據《TheVerge》最新報道&#xff0c;OpenAI 正準備在 8 月發布新版本旗艦大模型 GPT-5&#xff0c;如果順利的話發布節點最早會在 8 月初。同時&#xff0c;下個月發布 GPT-5 時&#xff0c;還會一并推出 mini&#xff08;小型&#xff09;和 nano&#xff08;微型&#xff09;…

【Linux操作系統】簡學深悟啟示錄:Linux環境基礎開發工具使用

文章目錄1.軟件包管理器yum2.Linux編輯器vim2.1 三模式切換2.2 正常模式2.3 底行模式2.4 可視化模式2.5 vim 配置3.Linux編譯器gcc/g3.1 預處理3.2 編譯3.3 匯編3.4 連接3.5 函數庫4.Linux自動化構建工具Makefile5.Linux調試器gdb希望讀者們多多三連支持小編會繼續更新你們的鼓…

八大神經網絡的區別

神經網絡名稱全稱/修正名稱主要作用核心特點典型應用場景CINICNN&#xff08;卷積神經網絡&#xff09;處理圖像、視頻等空間數據&#xff0c;提取局部特征。使用卷積核、池化操作&#xff1b;擅長平移不變性。圖像分類、目標檢測、人臉識別。RINIRNN&#xff08;循環神經網絡&…

從 SQL Server 到 KingbaseES V9R4C12,一次“無痛”遷移與深度兼容體驗實錄

#數據庫平替用金倉 #金倉產品體驗官 摘要&#xff1a;本文以體驗項目案例為主線&#xff0c;從下載安裝、數據類型、T-SQL、JDBC、性能基準、踩坑回退六大維度&#xff0c;全景驗證 KingbaseES V9R4C12 對 SQL Server 的“零改造”兼容承諾&#xff1b;并給出 TPCH 100G 性能對…

EasyPlayer播放器系列開發計劃2025

EasyPlayer系列產品發展至今&#xff0c;已經超過10年&#xff0c;從最早的EasyPlayer RTSP播放器&#xff0c;到如今維護的3條線&#xff1a;EasyPlayer-RTSP播放器&#xff1a;Windows、Android、iOS&#xff1b;EasyPlayerPro播放器&#xff1a;Windows、Android、iOS&#…

通信名詞解釋:I2C、USART、SPI、RS232、RS485、CAN、TCP/IP、SOCKET、modbus等

以下內容參考AI生成內容1. I2C&#xff08;Inter-Integrated Circuit&#xff0c;集成電路間總線&#xff09;定義&#xff1a;由飛利浦&#xff08;現恩智浦&#xff09;開發的短距離串行通信總線&#xff0c;用于芯片級設備間的低速數據傳輸。工作原理&#xff1a;采用兩根信…

bash的特性-常見的快捷鍵

一、前言在 Linux Shell 編程和日常使用中&#xff0c;Bash 快捷鍵 是提升命令行操作效率的利器。熟練掌握這些快捷鍵&#xff0c;不僅可以節省大量輸入時間&#xff0c;還能顯著提升你在終端環境下的操作流暢度。本文將帶你全面了解 Bash 中常用的快捷鍵&#xff0c;包括&…

【Java Web實戰】從零到一打造企業級網上購書網站系統 | 完整開發實錄(三)

&#x1f3a8; 核心功能設計 &#x1f464; 用戶管理系統 用戶管理是整個系統的基礎&#xff0c;我設計了完整的用戶生命周期管理&#xff1a; &#x1f510; 用戶注冊流程 #mermaid-svg-D0eUHWissjNhkqlB {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

uniapp input 聚焦時鍵盤彈起滾動到對應的部分

實現效果代碼如下<template><view idapp><view class"aa"></view><iconfont name"left"></iconfont>姓氏&#xff1a;<input style"background-color: antiquewhite;" type"text" v-model&quo…

【基礎篇三】WebSocket:實時通信的革命

目錄 一、傳統HTTP的"痛點"分析 1.1 HTTP的單向通信模式 1.2 "實時"效果的痛苦嘗試 ?編輯 1.3 性能對比分析 二、WebSocket 協議詳解 2.1 WebSocket是什么&#xff1f; ?編輯 2.2 WebSocket的核心特性 2.2.1 全雙工通信&#xff08;Full-Duple…

設計模式(十八)行為型:中介者模式詳解

設計模式&#xff08;十八&#xff09;行為型&#xff1a;中介者模式詳解中介者模式&#xff08;Mediator Pattern&#xff09;是 GoF 23 種設計模式中的行為型模式之一&#xff0c;其核心價值在于通過引入一個中介者對象來封裝一組對象之間的交互&#xff0c;從而降低對象間的…

Upload-Labs通關全攻略詳細版

前端校驗繞過:pass 01 兩種思路:1.通過抓包,修改后綴 2.前端禁用js繞過前端后綴檢驗 首先寫一個木馬,改為圖片格式GIF89a<?php eval($_POST[cmd])?>抓包之后改為PHP格式: 使用蟻劍連接木馬,第一次嘗試一直是返回數據為空,原因是沒有鏈接到木馬,于是尋找木馬地址…

C#觀察者模式示例代碼

using System; using System.Collections.Generic; using System.Threading;namespace RefactoringGuru.DesignPatterns.Observer.Conceptual {// Observer觀察者 也可以叫做訂閱者 subscriberspublic interface IObserver{// Receive update from subject// 接收來自主題的更新…

電子電子架構 --- 軟件項目的開端:裁剪

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

Open CV圖像基本操作可莉版

Open CV圖像基本操作一、處理單個像素值訪問像素值修改像素值二、處理單個ROI區域&#xff08;自選區域&#xff09;提取 ROI修改 ROI三、 處理圖像通道通道分離通道合并四、處理整體圖像縮放圖像旋轉圖像平移圖像翻轉一、處理單個像素值 圖像是由像素組成的矩陣&#xff0c;每…

k8s:將打包好的 Kubernetes 集群鏡像推送到Harbor私有鏡像倉庫

本文介紹了在離線環境中部署Harbor鏡像倉庫的完整流程。首先通過腳本創建多個Harbor項目&#xff0c;然后使用KubeKey工具將預打包的Kubernetes鏡像(kubesphere.tar.gz)推送到Harbor倉庫。接著配置containerd以支持從私有倉庫拉取鏡像&#xff0c;包括設置TLS證書和鏡像倉庫端點…