:從直線到圓與任意形狀的MATLAB實(shí)現(xiàn))
簡(jiǎn)介這是一份面向數(shù)字圖像處理方向的本科畢業(yè)設(shè)計(jì)開(kāi)題報(bào)告聚焦基于Hough變換的圖像邊界跟蹤算法與仿真。文檔系統(tǒng)闡述了Hough變換將圖像空間映射到參數(shù)空間以檢測(cè)直線、圓等幾何形狀的基本原理梳理了數(shù)字圖像分割技術(shù)的應(yīng)用背景并規(guī)劃了利用MATLAB實(shí)現(xiàn)直線檢測(cè)、算法優(yōu)化的研究路線適合正在準(zhǔn)備機(jī)器視覺(jué)、圖像分割類畢設(shè)課題的學(xué)生參考。壓縮包僅含1個(gè)docx文檔大小39KB內(nèi)容結(jié)構(gòu)完整從立項(xiàng)意義、Hough變換理論、MATLAB仿真步驟到未來(lái)擴(kuò)展方向均有涉及便于直接復(fù)用和二次修改。已有184人學(xué)習(xí)/下載對(duì)于需要快速搭建開(kāi)題框架、明確研究思路的讀者來(lái)說(shuō)是一份務(wù)實(shí)且輕量的參考模板。1. 邊界檢測(cè)從 Hough 變換入手直線、圓和任意形狀的跟蹤思路拿一幅公路照片或工業(yè)零件圖直接套用 Canny 邊緣檢測(cè)得到的結(jié)果是一堆斷裂的亮點(diǎn)。要告訴程序“這里有一條直線”或“這里是一個(gè)圓”下一步往往是做 Hough 變換。它把圖像坐標(biāo)映射到參數(shù)空間將幾何形狀檢測(cè)轉(zhuǎn)換為累計(jì)數(shù)組的峰值統(tǒng)計(jì)天然容忍邊緣斷裂和少量噪聲。這份原始開(kāi)題報(bào)告以 docx 形式整理了數(shù)字圖像處理中基于 Hough 變換的邊界跟蹤思路內(nèi)容從直線檢測(cè)講到廣義 Hough 變換適合正在做圖像分割畢設(shè)、或剛接觸計(jì)算機(jī)視覺(jué)的人用來(lái)搭第一版可運(yùn)行的原型。下面按理論、MATLAB 實(shí)現(xiàn)、擴(kuò)展與驗(yàn)證的順序展開(kāi)所有例程都以 MATLAB 圖像處理工具箱為運(yùn)行環(huán)境。2. Hough 變換的理論基礎(chǔ)點(diǎn)線對(duì)偶為什么比斜率擬合更穩(wěn)Hough 變換最早用于在二值圖像中檢測(cè)直線?;舅枷胧屈c(diǎn)與線的對(duì)偶圖像空間中的一條直線對(duì)應(yīng)參數(shù)空間中的一個(gè)點(diǎn)反過(guò)來(lái)圖像空間中的一個(gè)點(diǎn)對(duì)應(yīng)參數(shù)空間中的一條曲線。對(duì)直線 ykxb 來(lái)說(shuō)過(guò)點(diǎn) (x0,y0) 的所有直線滿足 y0kx0b把 k 和 b 當(dāng)作變量就得到參數(shù)平面上的一條直線。多個(gè)共線點(diǎn)對(duì)應(yīng)的參數(shù)直線會(huì)交于同一點(diǎn)這個(gè)交點(diǎn)就是原圖直線的 (k,b)。這是理論上最直觀的版本但實(shí)現(xiàn)起來(lái)有麻煩斜率 k 的值域沒(méi)有邊界豎直線的 k 趨向無(wú)窮大離散化時(shí)不知道該把累加范圍設(shè)多大。改用極坐標(biāo)表示可以避開(kāi)這個(gè)問(wèn)題。直線方程寫(xiě)成 ρ xcosθ ysinθ其中 θ 是直線法線與 x 軸的夾角ρ 是原點(diǎn)到直線的垂直距離。對(duì)圖像平面上的一點(diǎn)它在 (θ, ρ) 參數(shù)空間里是一條正弦曲線原圖中同一條直線上的所有點(diǎn)對(duì)應(yīng)的正弦曲線都會(huì)經(jīng)過(guò)同一個(gè) (θ, ρ)。這樣就把“找直線”變成“找正弦曲線的交點(diǎn)”。角度范圍取 θ ∈ [-90°, 90°)ρ 的范圍由圖像尺寸決定最大不超過(guò)對(duì)角線長(zhǎng)度。MATLAB 內(nèi)置 hough 函數(shù)使用這個(gè)表示形式注意它把 θ90° 的場(chǎng)景用 θ-90° 和負(fù) ρ 處理返回結(jié)果中不會(huì)出現(xiàn) 90°。舉一個(gè)三點(diǎn)的例子圖像平面上的直線 yx 上的點(diǎn) A(0,0)、B(1,1)、C(2,2)在斜率-截距空間分別對(duì)應(yīng) b0、kb1、2kb2 三條直線三線交于 (k1,b0)。換成極坐標(biāo)后同樣的邏輯依然成立只是參數(shù)曲線從直線變成了正弦曲線因此累計(jì)單元也叫 Hough 空間。這個(gè)“多曲線交于一點(diǎn)”的性質(zhì)就是后續(xù)所有投票統(tǒng)計(jì)的基礎(chǔ)。2.1 累計(jì)矩陣的離散化與內(nèi)存估算參數(shù)空間不能連續(xù)存儲(chǔ)必須離散成累計(jì)矩陣。θ 步長(zhǎng)取 1°累計(jì)矩陣有 180 個(gè)角度列ρ 按 1 像素間隔行數(shù)約等于圖像對(duì)角線長(zhǎng)度的兩倍。對(duì) 1024×768 的圖對(duì)角線約 1280累計(jì)矩陣大約 2560×180數(shù)據(jù)量很小。θ 步長(zhǎng)取 0.5°精度提高但累計(jì)矩陣行數(shù)不變、列數(shù)翻倍對(duì)直線角度分辨率的提升有限卻會(huì)明顯增加峰值搜索時(shí)間。實(shí)際項(xiàng)目中先用 1° 跑通流程再根據(jù)檢測(cè)結(jié)果決定是否加密。離散化步長(zhǎng)還直接影響后續(xù) houghpeaks 的峰寬。步長(zhǎng)過(guò)大時(shí)同一條直線上的點(diǎn)在參數(shù)空間可能落進(jìn)相鄰單元峰值被攤薄最大響應(yīng)值下降。步長(zhǎng)過(guò)小時(shí)噪聲點(diǎn)也會(huì)形成局部小峰誤檢更容易發(fā)生。一般工業(yè)圖像用 1° 步長(zhǎng)足夠只有對(duì)角度精度要求低于 0.5° 的場(chǎng)景才需要加密比如芯片引腳的角度測(cè)量。參數(shù)空間表示形式累計(jì)范圍主要問(wèn)題斜率-截距空間y kx bk 值域無(wú)邊界豎直線無(wú)法表示投票范圍難以確定極坐標(biāo) Hough 空間ρ xcosθ ysinθθ ∈ [-90°, 90°)ρ 按對(duì)角線長(zhǎng)度取離散化步長(zhǎng)影響精度與內(nèi)存占用2.2 用 MATLAB 手工實(shí)現(xiàn)投票過(guò)程下面這段代碼不調(diào)用現(xiàn)成 hough 函數(shù)而是手動(dòng)完成投票用來(lái)觀察兩個(gè)點(diǎn)如何在參數(shù)空間形成交點(diǎn)。% 生成一幅只有兩個(gè)邊緣點(diǎn)的二值圖 BW zeros(64, 64); BW(10, 20) 1; % 第10行第20列 BW(50, 20) 1; % 第50行第20列兩個(gè)點(diǎn)在同一列 % 定義角度范圍和距離范圍 theta -90:0.5:89; % 角度步長(zhǎng)0.5度 D round(sqrt(size(BW, 1)^2 size(BW, 2)^2)); % 對(duì)角線上界 rho -D:1:D; H zeros(numel(rho), numel(theta)); % 累計(jì)矩陣 % 遍歷所有邊緣點(diǎn)和角度完成投票 [y, x] find(BW); % y是行坐標(biāo)x是列坐標(biāo) for k 1:numel(theta) t theta(k) * pi / 180; for i 1:numel(x) r x(i) * cos(t) y(i) * sin(t); % 極坐標(biāo)投影 [~, idx] min(abs(rho - r)); % 找到最近的離散rho單元 H(idx, k) H(idx, k) 1; end end % 顯示參數(shù)空間兩個(gè)點(diǎn)會(huì)形成兩條正弦曲線交點(diǎn)對(duì)應(yīng)原圖豎直線 imagesc(theta, rho, H); xlabel(theta (deg)); ylabel(rho (pixel));邏輯說(shuō)明代碼先把二值圖的像素坐標(biāo)取出來(lái)外層循環(huán)遍歷角度內(nèi)層循環(huán)把每個(gè)點(diǎn)投影到當(dāng)前角度對(duì)應(yīng)的 ρ 上并在累計(jì)矩陣對(duì)應(yīng)單元加 1。兩個(gè)點(diǎn)位于同一列因此兩條正弦曲線在 θ0、ρ20 處相交這個(gè)交點(diǎn)就是原圖豎直邊界在參數(shù)空間中的表示。imagesc顯示的亮色交叉點(diǎn)就是后續(xù) houghpeaks 要尋找的目標(biāo)。參數(shù)說(shuō)明θ 范圍取了 -90 到 89步長(zhǎng) 0.5 度覆蓋了所有直線方向ρ 步長(zhǎng)取 1 像素范圍取對(duì)角線長(zhǎng)度保證任何直線都能落進(jìn)累計(jì)矩陣。實(shí)際工程不推薦手寫(xiě)這樣的雙循環(huán)MATLAB 內(nèi)置 hough 函數(shù)已經(jīng)用向量化實(shí)現(xiàn)了相同邏輯但理解投票過(guò)程對(duì)后續(xù)調(diào)參很重要。3. MATLAB 直線檢測(cè)實(shí)現(xiàn)hough、houghpeaks 與參數(shù)調(diào)優(yōu)MATLAB 圖像處理工具箱把 Hough 變換封裝為三個(gè)函數(shù)hough 負(fù)責(zé)計(jì)算累計(jì)矩陣houghpeaks 在累計(jì)矩陣中找候選峰houghlines 把峰還原成線段端點(diǎn)。常用的完整流程是讀圖、灰度化、邊緣檢測(cè)、hough、houghpeaks、houghlines。邊緣檢測(cè)一般選 Canny 而不是 Sobel因?yàn)?Canny 能提供更細(xì)的單像素邊緣Hough 的投票結(jié)果更集中峰值也更尖銳。3.1 完整檢測(cè)流程與繪圖% 讀取圖像統(tǒng)一轉(zhuǎn)成灰度 I imread(road.png); if size(I, 3) 3 I rgb2gray(I); end % Canny 邊緣檢測(cè)低閾值0.1保留弱邊緣高閾值0.2抑制噪聲 BW edge(I, canny, [0.1 0.2]); % 計(jì)算累計(jì)矩陣角度步長(zhǎng)0.5度rho步長(zhǎng)由hough自動(dòng)按像素取 [H, T, R] hough(BW, Theta, -90:0.5:89); % 找前20個(gè)峰值閾值取全局峰值的30% P houghpeaks(H, 20, Threshold, ceil(0.3 * max(H(:)))); % 按峰值還原線段間隙小于15像素的連接長(zhǎng)度小于40像素的丟棄 lines houghlines(BW, T, R, P, FillGap, 15, MinLength, 40); % 在原圖上疊畫(huà)檢測(cè)結(jié)果 imshow(I); hold on; for k 1:numel(lines) xy [lines(k).point1; lines(k).point2]; plot(xy(:, 1), xy(:, 2), LineWidth, 2, Color, red); end邏輯說(shuō)明edge 返回邏輯矩陣hough 只對(duì)這種二值圖統(tǒng)計(jì)不需要額外做閾值化返回值 T 是角度向量R 是距離向量P 是峰值所在的行列下標(biāo)houghlines 根據(jù) P 中的累計(jì)單元位置反向搜索邊緣點(diǎn)把同一段直線聚合成線段。plot 循環(huán)里 lines 的 point1 和 point2 分別是 [x1,y1] 和 [x2,y2]對(duì)應(yīng)圖像坐標(biāo)的列和行。參數(shù)說(shuō)明Canny 的兩個(gè)閾值按梯度歸一化到 [0,1]。低閾值控制弱邊緣的保留量調(diào)低會(huì)把更多弱邊界放進(jìn) Hough 投票同時(shí)噪聲也會(huì)變多高閾值控制強(qiáng)邊緣確認(rèn)通常設(shè)低閾值的 1.5 到 3 倍。hough 的 Theta 步長(zhǎng)越小角度分辨率越高累計(jì)矩陣規(guī)模越大。houghpeaks 的 Threshold 默認(rèn)是 0.5 倍全局最大峰檢測(cè)較強(qiáng)的主邊緣時(shí)夠用如果圖像內(nèi)容復(fù)雜、邊緣強(qiáng)弱不均降到 0.3 以下會(huì)找到更多候選但誤檢也隨之上升。3.2 關(guān)鍵參數(shù)表與調(diào)整順序函數(shù)參數(shù)常用取值影響houghTheta-90:0.5:89步長(zhǎng)越小角度分辨率越高耗時(shí)越長(zhǎng)houghpeaksNumPeaks5~20最多檢測(cè)出的直線數(shù)量houghpeaksThreshold0.3~0.6 倍 max(H)閾值低則候選多、誤檢多houghpeaksNHoodSize默認(rèn)或 [5 5]相鄰峰值的最小間隔houghlinesFillGap10~20斷線合并間隙單位像素houghlinesMinLength30~80最短線段長(zhǎng)度單位像素工程里最常見(jiàn)的坑是峰值閾值和邊緣質(zhì)量不匹配。邊緣檢測(cè)用 Sobel 時(shí)梯度響應(yīng)較粗同一根直線會(huì)在累計(jì)矩陣留下寬峰houghpeaks 容易把一條直線重復(fù)識(shí)別成多條相近直線換用 Canny 并打開(kāi)細(xì)化之后峰值會(huì)更尖銳。另一個(gè)常見(jiàn)問(wèn)題是短線段被 MinLength 誤刪。對(duì)零件輪廓這類場(chǎng)景實(shí)際邊界長(zhǎng)度往往只有幾十像素MinLength 設(shè) 40 會(huì)漏檢先設(shè) 10 跑一遍看輸出線段數(shù)量再逐步抬高比一開(kāi)始就追求“干凈結(jié)果”更省時(shí)間。如果 lines 返回為空先從邊緣圖找原因把 BW 單獨(dú)顯示出來(lái)若白色像素稀疏說(shuō)明 Canny 閾值過(guò)高降為 [0.05 0.15] 再試若白色像素密集成片說(shuō)明閾值過(guò)低先把高閾值調(diào)到 0.25。只有邊緣圖看起來(lái)是細(xì)線狀態(tài)hough 的投票才可能集中。之后再看 Threshold很多人在這里設(shè)了 0.8 倍最大峰導(dǎo)致次強(qiáng)直線全部被濾掉。先設(shè) 0.2 跑一次確認(rèn)所有預(yù)期直線出現(xiàn)后再逐步抬高。提示hough 函數(shù)的輸入必須是邏輯矩陣edge 的輸出恰好滿足如果直接把 uint8 灰度圖傳進(jìn)去MATLAB 會(huì)把非零像素全部當(dāng)作邊緣點(diǎn)投票結(jié)果基本不可用。4. 圓檢測(cè)與廣義 Hough 變換三維累計(jì)和 R-table 的取舍直線只有兩個(gè)自由度累計(jì)矩陣是二維的。圓有三個(gè)參數(shù)圓心坐標(biāo) (a,b) 和半徑 r參數(shù)空間變成三維。原始圖像邊緣上的每個(gè)點(diǎn)在 (a,b,r) 空間中投影為一個(gè)圓錐面同一圓周的點(diǎn)其圓錐面交于同一個(gè) (a,b,r)。這種做法的好處是理論直接缺陷是累計(jì)矩陣規(guī)模隨參數(shù)維數(shù)指數(shù)增長(zhǎng)。一張 512×512 的圖a、b 各 512 個(gè)單元、r 共 50 個(gè)候選累計(jì)單元數(shù)量超過(guò) 1300 萬(wàn)double 存儲(chǔ)就需要約 100MB。因此工程上很少把三維網(wǎng)格全部建出來(lái)常見(jiàn)做法用 Hough 梯度法先求邊緣點(diǎn)的梯度方向圓心必在法線方向上距邊緣點(diǎn) r 的位置從而把三維搜索拆成兩輪投票。MATLAB 的 imfindcircles 就是這個(gè)思路的封裝。它先對(duì)圖像求梯度再對(duì)每個(gè)邊緣點(diǎn)沿梯度方向累加圓心投票最后在投票數(shù)組里找峰值并反推半徑。這個(gè)函數(shù)比手寫(xiě)三維循環(huán)快很多也避免了顯式建立大數(shù)組。4.1 用 imfindcircles 檢測(cè)圓形邊界% 讀取包含圓形目標(biāo)的灰度圖 I imread(coins.png); if size(I, 3) 3 I rgb2gray(I); end % 在15到35像素半徑范圍內(nèi)找亮色圓形目標(biāo) [centers, radii] imfindcircles(I, [15 35], ... ObjectPolarity, bright, ... Sensitivity, 0.9, ... Method, TwoStage); % 繪制結(jié)果便于人工確認(rèn) imshow(I); hold on; viscircles(centers, radii, EdgeColor, b, LineWidth, 1.5); plot(centers(:, 1), centers(:, 2), r);邏輯說(shuō)明imfindcircles 第一參數(shù)可以是灰度圖也可以是邊緣圖直接用灰度圖時(shí)內(nèi)部先算梯度再用 TwoStage 策略完成兩輪投票。ObjectPolarity 告訴算法目標(biāo)是亮底暗圓還是暗底亮圓方向設(shè)反會(huì)直接導(dǎo)致零結(jié)果。Sensitivity 控制投票峰值的保留比例0.9 比默認(rèn) 0.85 更激進(jìn)適合邊界對(duì)比度不高的圖但誤檢也會(huì)增加。返回的 centers 是 N×2 矩陣radii 是 N×1 向量直接把半徑和圓心傳給 viscircles 就能在圖上疊圓。參數(shù)說(shuō)明半徑范圍 [15 35] 需要提前預(yù)估目標(biāo)大小范圍越窄誤檢越少但真實(shí)半徑超出范圍時(shí)檢測(cè)不到。Sensitivity 和 EdgeThreshold 通常需要配合調(diào)整Sensitivity 調(diào)高引入大量假圓時(shí)把 EdgeThreshold 從默認(rèn) 0.1 提升到 0.2讓邊緣更干凈比單純降 Sensitivity 更有效。對(duì)于邊緣模糊的目標(biāo)兩階段法比 PhaseCode 方法更穩(wěn)定代價(jià)是速度略慢。4.2 廣義 Hough 變換從解析形狀到任意形狀圓是解析形狀但實(shí)際需要跟蹤的目標(biāo)經(jīng)常沒(méi)有方程比如零件輪廓、車道邊緣曲線。廣義 Hough 變換的思路是提前為模板形狀建一張 R-table對(duì)模板邊緣點(diǎn)計(jì)算梯度方向 φ記錄每個(gè)梯度方向下邊緣點(diǎn)相對(duì)于參考點(diǎn)的向量 r。檢測(cè)時(shí)目標(biāo)邊緣點(diǎn)按自身梯度方向查表把參考點(diǎn)的候選位置投票到二維累積數(shù)組峰值就是形狀最可能出現(xiàn)的參考點(diǎn)位置。由于檢測(cè)過(guò)程不依賴曲線方程任意形狀都能跟蹤。代價(jià)是 R-table 的構(gòu)建依賴模板目標(biāo)的尺度變化和旋轉(zhuǎn)需要額外處理。原始開(kāi)題報(bào)告把廣義 Hough 變換列為后續(xù)研究方向?qū)嶋H落地時(shí)要注意每次旋轉(zhuǎn)角度變化R-table 都要重建尺度變化可以通過(guò)對(duì)梯度方向不變性做歸一化來(lái)緩解但計(jì)算量成倍增加。工程中若形狀固定用 R-table 加快檢測(cè)是可行的尺度變化明顯的場(chǎng)景優(yōu)先考慮輪廓匹配或基于深度學(xué)習(xí)的分割而不是繼續(xù)堆 Hough 投票。檢測(cè)對(duì)象參數(shù)空間維度累計(jì)規(guī)模示例常用函數(shù)直線二維θ, ρ360 × 約2560hough / houghpeaks圓三維a, b, r512×512×50imfindcircles任意形狀參考點(diǎn)二維 R-table由模板大小決定自定義實(shí)現(xiàn)5. Hough 變換排錯(cuò)與驗(yàn)證峰值閾值、鄰域抑制和結(jié)果檢查參數(shù)問(wèn)題通常出在三處。第一是峰值閾值拿到累計(jì)矩陣后先看 max(H(:))若峰值強(qiáng)度差異懸殊單一閾值會(huì)漏掉弱直線。常用做法是保留兩個(gè)候選層次先按 0.5 倍全局峰提取主邊界再把閾值降到 0.2 倍并把結(jié)果合并去重。第二是 NHoodSize默認(rèn)值偏大會(huì)把相距很近的平行線合并成一個(gè)峰需要檢測(cè)角度相近的線時(shí)可以把 NHoodSize 的鄰域縮小到 [5 5]代價(jià)是峰值增多后續(xù)用 MinLength 過(guò)濾。第三是圓檢測(cè)的 Sensitivity調(diào)高會(huì)引入大量假圓這時(shí)配合 EdgeThreshold 提高邊緣質(zhì)量門檻比單純降 Sensitivity 更有效。% 輸出每條直線的角度、距離和長(zhǎng)度 for k 1:numel(lines) fprintf(Line %d: theta%.2f rho%.2f len%.2f\n, ... k, lines(k).theta, lines(k).rho, ... norm(lines(k).point1 - lines(k).point2)); end % 查看累計(jì)矩陣峰值位置確認(rèn)候選峰與人工預(yù)期一致 figure; imshow(imadjust(mat2gray(H)), XData, T, YData, R, ... InitialMagnification, fit); axis on; xlabel(theta (deg)); ylabel(rho (pixel));上述代碼是驗(yàn)證環(huán)節(jié)最常用的兩個(gè)動(dòng)作。第一條輸出把 theta 和 rho 打出來(lái)經(jīng)驗(yàn)判斷是圖像中平行的兩條真實(shí)邊界其 theta 應(yīng)當(dāng)接近如果輸出出現(xiàn) theta 相差 3° 以上且肉眼明顯不平行說(shuō)明峰值被噪聲牽引需要縮小 NHoodSize 重新提取。第二條把累計(jì)矩陣當(dāng)圖像顯示峰值區(qū)域的亮斑對(duì)應(yīng)候選直線亮斑越集中邊界越干凈亮斑是一條長(zhǎng)弧而非單點(diǎn)說(shuō)明該直線附近的邊緣點(diǎn)分散在多個(gè)角度上常見(jiàn)于邊緣檢測(cè)的梯度響應(yīng)過(guò)寬。一個(gè)收尾技巧是在同樣的邊緣圖上先用 Hough 檢測(cè)直線再檢查交點(diǎn)。比如要確認(rèn)某個(gè)角點(diǎn)定位是否正確取兩條相鄰線段的方向向量做叉積將交點(diǎn)和人工標(biāo)定的像素坐標(biāo)對(duì)比。誤差在一個(gè)像素左右說(shuō)明整條鏈路正常誤差偏大時(shí)先對(duì)邊緣圖做一次形態(tài)學(xué)膨脹再重新做 hough通常能把峰位拉回正確位置。本文還有配套的精品資源點(diǎn)擊獲取