【圖像處理】霍夫變換:霍夫變換原理、霍夫空間、霍夫直線、霍夫圓詳解與代碼示例

霍夫變換詳解與代碼示例

霍夫變換(Hough Transform)是一種用于檢測圖像中幾何形狀(如直線、圓)的特征提取技術。其核心思想是將圖像空間中的點映射到參數空間(霍夫空間),通過累積投票機制識別形狀。下面我將逐步推導原理、解釋霍夫空間、詳述直線和圓檢測,并提供Python代碼示例(使用OpenCV庫)。


1. 霍夫變換原理

霍夫變換基于參數化思想:圖像空間中的點對應霍夫空間中的曲線,而霍夫空間中的峰值對應圖像中的幾何形狀。

  • 基本推導(以直線為例):
    • 圖像空間中,一條直線可表示為 y=mx+cy = mx + cy=mx+c,但此形式在垂直線時斜率 mmm 無限大,不實用。改用極坐標方程:
      ρ=xcos?θ+ysin?θ \rho = x \cos \theta + y \sin \theta ρ=xcosθ+ysinθ
      其中:
      • ρ\rhoρ 是原點到直線的垂直距離(ρ≥0\rho \geq 0ρ0),
      • θ\thetaθ 是直線與x軸的夾角(0≤θ<180°0 \leq \theta < 180^\circ0θ<180°)。

在這里插入圖片描述

  • 圖像空間中每個點 (xi,yi)(x_i, y_i)(xi?,yi?) 對應霍夫空間中的一條正弦曲線:ρ=xicos?θ+yisin?θ\rho = x_i \cos \theta + y_i \sin \thetaρ=xi?cosθ+yi?sinθ

  • 多個點共線時,它們在霍夫空間中的曲線相交于一點 (θk,ρk)(\theta_k, \rho_k)(θk?,ρk?),該點即為直線參數。

  • 累積投票:將霍夫空間離散化為網格(累加器數組),每個點 (xi,yi)(x_i, y_i)(xi?,yi?) 對所有可能的 θ\thetaθ 計算 ρ\rhoρ,并在對應網格單元投票。峰值單元對應檢測到的直線。
    在這里插入圖片描述

  • 通用原理

    • 適用于任意參數化形狀(如圓、橢圓)。
    • 優點:對噪聲和部分遮擋魯棒;缺點:計算復雜度隨參數維度增加(如直線是二維,圓是三維)。

2. 霍夫空間

霍夫空間是參數空間,用于累積投票:

  • 定義:圖像空間中的點映射到參數空間中的曲線或曲面。
  • 量化
    • θ\thetaθ 范圍:000180°180^\circ180°(或 000π\piπ 弧度),通常離散為 1°1^\circ1° 步長。
    • ρ\rhoρ 范圍:?D-D?DDDDDDD 為圖像對角線長度),離散為整數步長(如1像素)。
  • 累加器:二維數組 A[θ][ρ]A[\theta][\rho]A[θ][ρ],初始為0。每個邊緣點增加通過它的所有可能直線的投票數。峰值 A[θk][ρk]A[\theta_k][\rho_k]A[θk?][ρk?] 表示檢測結果。

3. 霍夫直線檢測

基于上述原理,檢測圖像中的直線:

  • 步驟

    1. 邊緣檢測:預處理圖像(如Canny邊緣檢測),獲取二值邊緣圖。
    2. 映射到霍夫空間:對每個邊緣點 (xi,yi)(x_i, y_i)(xi?,yi?),遍歷 θ\thetaθ(例如 θ=0°,1°,…,179°\theta = 0^\circ, 1^\circ, \dots, 179^\circθ=0°,1°,,179°),計算 ρ=xicos?θ+yisin?θ\rho = x_i \cos \theta + y_i \sin \thetaρ=xi?cosθ+yi?sinθ,并累加 A[θ][ρ]A[\theta][\rho]A[θ][ρ]
    3. 找峰值:設定閾值,A[θ][ρ]>閾值A[\theta][\rho] > \text{閾值}A[θ][ρ]>閾值 的單元對應檢測到的直線。
    4. 轉換回圖像空間:用 (θk,ρk)(\theta_k, \rho_k)(θk?,ρk?) 繪制直線 ρk=xcos?θk+ysin?θk\rho_k = x \cos \theta_k + y \sin \theta_kρk?=xcosθk?+ysinθk?
  • 優化:使用概率霍夫變換(Probabilistic Hough Transform),隨機采樣邊緣點,減少計算量。


4. 霍夫圓檢測

圓檢測擴展了霍夫變換到三維參數空間:

  • 圓方程:圓心 (a,b)(a, b)(a,b),半徑 rrr,方程為:
    (x?a)2+(y?b)2=r2 (x - a)^2 + (y - b)^2 = r^2 (x?a)2+(y?b)2=r2
  • 霍夫空間:三維空間 (a,b,r)(a, b, r)(a,b,r)
  • 步驟
    1. 邊緣檢測:獲取邊緣圖。
    2. 梯度優化:利用邊緣梯度方向減少計算:
      • 邊緣點 (xi,yi)(x_i, y_i)(xi?,yi?) 的梯度方向 ?\phi? 近似圓心方向。
      • 對每個邊緣點,沿梯度方向 ?\phi??+180°\phi + 180^\circ?+180°,在可能半徑 rrr 范圍內計算圓心 (a,b)(a, b)(a,b)
        a=xi?rcos??,b=yi?rsin?? a = x_i - r \cos \phi, \quad b = y_i - r \sin \phi a=xi??rcos?,b=yi??rsin?
      • 累加三維累加器 A[a][b][r]A[a][b][r]A[a][b][r]
    3. 找峰值:設定閾值,A[a][b][r]>閾值A[a][b][r] > \text{閾值}A[a][b][r]>閾值 的單元對應檢測到的圓。
  • 挑戰:三維空間計算量大,常使用多尺度或梯度方法優化。

5. 代碼示例

使用Python和OpenCV實現霍夫直線和圓檢測。需安裝OpenCV:pip install opencv-python

(a) 霍夫直線檢測代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt# 讀取圖像并轉換為灰度
image = cv2.imread('input.jpg')  # 替換為您的圖像路徑
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 邊緣檢測(Canny)
edges = cv2.Canny(gray, 50, 150)  # 閾值50和150# 霍夫直線變換
# 參數:邊緣圖, rho精度(1像素), theta精度(1度), 閾值(投票數)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 150)  # 閾值調整以控制檢測靈敏度# 繪制檢測到的直線
if lines is not None:for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rho# 計算直線端點x1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)  # 紅色直線# 顯示結果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('霍夫直線檢測')
plt.axis('off')
plt.show()
(b) 霍夫圓檢測代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt# 讀取圖像并轉換為灰度
image = cv2.imread('input.jpg')  # 替換為您的圖像路徑
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)  # 中值濾波去噪# 霍夫圓變換
# 參數:輸入圖, 方法(HOUGH_GRADIENT), dp=1(累加器分辨率), minDist(圓心最小距離), param1(Canny高閾值), param2(累加器閾值), minRadius, maxRadius
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=50,param1=50, param2=30, minRadius=10, maxRadius=100)# 繪制檢測到的圓
if circles is not None:circles = np.uint16(np.around(circles))for circle in circles[0, :]:center = (circle[0], circle[1])  # 圓心radius = circle[2]  # 半徑cv2.circle(image, center, radius, (0, 255, 0), 2)  # 綠色圓cv2.circle(image, center, 2, (0, 0, 255), 3)  # 圓心紅點# 顯示結果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('霍夫圓檢測')
plt.axis('off')
plt.show()
代碼說明:
  • 輸入圖像:替換 'input.jpg' 為您的圖像路徑(確保圖像有清晰邊緣)。
  • 參數調整
    • 直線檢測:cv2.HoughLines 的閾值控制最少投票數(值越大,檢測越嚴格)。
    • 圓檢測:param2 是關鍵閾值(值越小,檢測越多圓,但噪聲增加)。
  • 輸出:顯示原圖疊加檢測結果(直線為紅色,圓為綠色帶圓心紅點)。
  • 優化:實際應用中,可結合圖像預處理(如高斯模糊)提高準確性。

霍夫變換是計算機視覺基礎工具,廣泛應用于車道檢測、工業質檢等領域。通過調整參數和優化方法,可平衡精度與效率。

總結

霍夫變換通過將圖像空間映射到參數空間,有效檢測幾何形狀。其核心是累加器投票機制,在霍夫空間中識別峰值。本示例展示了直線檢測的實現,可擴展到其他形狀(如圓)。實際使用時,建議結合圖像優化(如降采樣)以提高效率。如果您有特定圖像或擴展需求,我可以進一步調整代碼!

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

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

相關文章

Java WEB技術-序列化和反序列化認識(SpringBoot的Jackson序列化行為?如何打破序列化過程的駝峰規則?如何解決學序列化循環引用問題?)

一、什么是序列化和反序列化 在java項目中&#xff0c;對象序列化和反序列化通常用于對象的存儲或網絡傳輸等。如&#xff1a;服務端創建一個JSON對象&#xff0c;對象如何在網絡中進行傳輸呢&#xff1f;我們知道網絡傳輸的數據通常都是字節流的形式&#xff0c;對象想要在網絡…

【生活系列】MBTI探索 16 種性格類型

博客目錄一、MBTI 的四個核心維度1. 精力來源&#xff1a;外向&#xff08;E&#xff09;vs 內向&#xff08;I&#xff09;2. 信息獲取方式&#xff1a;感覺&#xff08;S&#xff09;vs 直覺&#xff08;N&#xff09;3. 決策方式&#xff1a;思考&#xff08;T&#xff09;v…

innovus在ccopt_design時設置update io latency

我正在「拾陸樓」和朋友們討論有趣的話題,你?起來吧? 拾陸樓知識星球入口 往期文章:

電腦出現英文字母開不了機怎么辦 原因與修復方法

當您按下電腦開機鍵&#xff0c;屏幕上卻只顯示一串串陌生的英文字母&#xff0c;無法正常進入系統時&#xff0c;這通常是電腦在向您“求救”。這種情況可能由多種原因引起&#xff0c;從外部設備沖突到系統文件損壞&#xff0c;都可能導致電腦無法啟動。不必過于焦慮&#xf…

CSS和XPATH選擇器對比

1、優缺點比較特性CSS選擇器XPath語法復雜度簡潔易讀較為復雜性能通常更快可能較慢向上遍歷不支持支持&#xff08;可選擇父元素&#xff09;文本內容選擇有限支持完全支持索引選擇支持&#xff08;:nth-child&#xff09;支持&#xff08;position()&#xff09;瀏覽器兼容性優…

libomxil-bellagio移植到OpenHarmony

當使用mesa3dcangh提供的amd顯卡驅動時&#xff0c;想利用 Mesa 提供的圖形硬件加速能力&#xff0c;來支持視頻編解碼操作時。需要依賴libomxil-bellagio庫&#xff0c;現在成果分享如下&#xff1a; 基礎知識 1.OpenHarmony中mesa3d amd顯卡驅動編譯 2.OpenHarmony中基于G…

uvm-tlm-sockets

TLM 2.0引入了套接字(Socket)機制&#xff0c;實現發起方(initiator)與目標方(target)組件間的異步雙向數據傳輸。套接字與端口(port)和導出(export)同源&#xff0c;均繼承自uvm_port_base基類。發起事務的組件使用發起方套接字(initiator socket)&#xff0c;稱為發起方&…

AI 如何評價股票:三七互娛(SZ:002555),巨人網絡(SZ:002558)

三七互娛&#xff08;SZ:002555&#xff09;作為國內領先的游戲公司&#xff0c;其股票表現需結合財務健康度、行業地位、戰略布局及潛在風險綜合評估。以下從多維度展開分析&#xff1a; 一、財務表現&#xff1a;增長乏力與高分紅并存營收與利潤雙降 2025年Q1營收42.43億元&a…

Vibe Coding:AI驅動開發的安全暗礁與防護體系

當OpenAI聯合創始人Andrej Karpathy在2025年初的推文里首次提及"Vibe Coding"時&#xff0c;這個概念迅速在開發者社區引發共鳴——它描繪了一種誘人的開發模式&#xff1a;開發者用自然語言描述需求&#xff0c;AI接管代碼生成、修改甚至調試&#xff0c;整個過程以…

四、主輔源電路

一、主輔源結構主輔源采用反激變換器拓撲&#xff0c;輸入供電有母線供電、電池輔源供電、電網輔源供電。開關管為一個高耐壓NMOS功率管。主控芯片采用ICE3BS03LJG&#xff0c;其主要參數如下&#xff1a;商品目錄AC-DC控制器和穩壓器是否隔離隔離工作電壓10.5V~26V開關頻率65k…

制造業企業如何保障文件外發圖紙數據安全的?

在制造業的發展進程中&#xff0c;文件外發是必不可少的環節&#xff0c;但這也給圖紙數據安全帶來了諸多挑戰。一旦圖紙數據泄露&#xff0c;企業的核心競爭力可能會受到嚴重損害。那么&#xff0c;制造業企業該如何保障文件外發圖紙數據安全呢&#xff1f;建立完善的管理制度…

RAG:讓AI更聰明的“外接大腦“ | AI小知識

RAG&#xff1a;讓AI更聰明的"外接大腦" 什么是RAG&#xff1f; 想象你在參加知識競賽&#xff0c;突然遇到不會的題目。這時你掏出手機快速搜索正確答案——這就是RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索式增強生成&#xff09;的工作原理。…

TCP 連接管理 之 三次握手詳解

TCP 連接管理 之 三次握手詳解 &#xff08;一&#xff09;TCP三次握手詳細過程及狀態變化 1. 第一次握手&#xff08;客戶端 → 服務器&#xff09; 報文標志位&#xff1a;SYN1&#xff08;同步序列號&#xff09;&#xff0c;ACK0&#xff08;首次握手無確認&#xff09;序列…

day066-內容分發網絡(CDN)與web應用防火墻(WAF)

文章目錄0. 老男孩思想-老男孩名言警句1. 云產品日常管理2. 創建快照策略3. CDN 內容分發網絡3.1 添加域名3.2 配置CNAME3.3 測試3.4 CDN刷新/預熱3.5 命中率3.5.1 查看命中率3.5.2 CDN命中率低怎么辦&#xff1f;3.6 訪問控制3.7 流量限制4. WAF web應用防火墻4.1 使用WAF4.2 …

Redis高頻問題全解析

Q1: Redis為什么這么快&#xff1f; Redis速度快主要有四個核心原因。首先是基于內存操作&#xff0c;所有數據都存儲在內存中&#xff0c;避免了磁盤I/O的開銷&#xff0c;內存讀寫速度比磁盤快幾萬倍。其次采用單線程模型&#xff0c;避免了多線程環境下的線程切換和鎖競爭帶…

【MATLAB】(三)數據類型與運算符

一.MATLAB的數據存儲類型一般而言&#xff0c;在 MATLAB 中數據的存儲與計算都是以雙精度進行的&#xff0c;但有多種顯示形式。在默認情況下&#xff0c;若數據為整數&#xff0c;就以整數表示;若數據為實數&#xff0c;則以保留小數點后4位的精度近似表示。用戶可以改變數字顯…

智能客服 VS 人工客服:電商企業該選哪種服務模式?

在數字化浪潮的推動下&#xff0c;電商企業對客戶服務的效率和質量提出了更高要求。智能客服與人工客服作為兩種主流服務模式&#xff0c;各有優劣。本文將從服務效率、成本投入、客戶體驗等維度&#xff0c;客觀分析兩者的特點&#xff0c;幫助電商企業做出合理選擇。一、服務…

前端基礎之《Vue(28)—Vue3 ref相關API》

ref相關API介紹1、ref()&#xff08;1&#xff09;ref介紹 ref用于定義基本數據類型&#xff0c;比如&#xff1a;string / boolean / number等&#xff08;因為這幾個沒辦法代理&#xff09;。 ref的背后是使用reactive來實現的響應式。 使用.value來訪問變量的值。&#xff0…

項目管理中如何避免延期?核心策略分析

在項目管理中避免延期&#xff0c;并非依賴于單一技巧&#xff0c;而是要構筑一個系統性的、多維度的防御體系。其核心策略涵蓋了&#xff1a;進行全面細致的前期規劃與估算、實施嚴格的范圍管理與變更控制、建立主動式全過程風險管理機制、維持高透明度的持續溝通、以及采用數…

【計算機視覺與代碼大模型全景解析:從理論基礎到學習路線】

&#x1f4d8;計算機視覺與代碼大模型全景解析&#xff1a;從理論基礎到學習路線&#x1f4d1; 目錄1?? 摘要2?? 計算機視覺與大模型基礎理論??2.1 &#x1f9e0; 深度卷積神經網絡基礎原理??2.2 &#x1f441;??&#x1f5e8;? 計算機視覺的技術發展與視覺圖靈概念…