角檢測或興趣點檢測，是計算機視覺系統中用來提取特徵以及推測影像內容的一種方法。角檢測的應用很廣，經常用在運動檢測、跟蹤、馬賽克（image mosaicing）、全景圖縫合（panorama stiching）、三維建模以及物體識別中。 問題定義 兩條邊的交點形成一個角（點）。而影像的要點（也稱為受關注點）是指影像中具有代表性以及穩健性（即指該點能夠在有噪聲干擾的情況下也能穩定的被定位，在大陸亦被稱為：魯棒性）的點。也就是說，要點可以是角（點），也可以不是，例如區域性亮點或暗點，線段終點，或者曲線上的曲率最大值點。在實際應用中，很多所謂的（角）點檢測演算法其實是檢測要點，而不僅僅是角（點）。所以，如果我們只想檢測角的話，還需要對檢測出的要點進一步分析。 例如也可以先經過邊檢測，之後在做一些後處理來檢測角，像是 Kirsch operator 和 FreiChen masking set 兩種方法。為了分辨區辨識時影像含有一部分目標影像的資訊是否正確，角檢測通常不是一個非常確定且同時需要很多額外的確認才可以確定，角檢測在影像上最簡單的做法是利用相關性，但這樣的作法需要耗費大量的運算資源以及得到的結果可能只是區域性最大值，因此有另一個常見的作法是使用 Harris 和 Stephens 所提出的經由改善 Moravec 方法的結果。 Moravec 角檢測演演算法 這是最早使用來做角檢測的做法，他首先定義所謂的「角」就是那些自我相似程度低的點。這個演演算法檢查所有影像中的畫素，並考慮以該畫素為中心點的一片範圍，該範圍與他周圍覆蓋最大的另一個範圍的相似度做為參考，而相似度通常是將兩個範圍的對應點計算誤差的平方和 SSD Sum of Squared differences ，越小代表相似度越高。 舉例來說，如果一個畫素是位於一片均勻強度的區塊時，這時每個畫素周圍與其附近的畫素的周圍都是相當類似的，因此相似度也高，不會被認為是角。而在圖形的邊界處的畫素，若是與邊垂直方向處附近的畫素，兩者的周圍影像相似度就會比較低，然而若是與邊平行附近的畫素，兩者的周圍影像相似度就會比較高 看到的都是一條在同樣位置的邊，因此也不會被認為是角。只有在那些與附近畫素的周圍影像都很不相似的畫素，才會被認為是「角」。 如果我們將這種與周圍的相似程度量化 使用誤差平方和，並且找出整個影像的區域性最大值 區域性最不相似的點，這些區域性最大值就很有可能是我們想要偵測到的「角」。 Harris Stephens Plessey ShiTomasi 角檢測演演算法 Harris Stephens 改善了 Moravec 的方法，他們直接考慮每個畫素沿著特定方向處的畫素的 SSD，而不是使用與周圍畫素範圍的 SSD。 不失一般性，我們假設現在是對一個灰階的 2 維影像來做偵測。令這個圖為 I ，考慮 u v 位置的畫素與周圍的區塊，並選取一個固定向量 x y 作為該畫素的參考畫素，因此固定的這個向量 x y 所算出的所有差平方和的總和記做為 S xy ，而對於每個 uv 做不同加權，就可以得到 S xy sum_u sum_v w uv left I uxvy I uvright2 如果使用泰勒展開式將 I uxvy 展開，假設 I_x 和 I_y 是 I 的偏微分，可以得到 I uxvy approx I uv I_x uv xI_y uv y 並將原式改寫成 S xy approx sum_u sum_v w uv left I_x uv x I_y uv y right2 或是使用矩陣來簡化算式 S xy approx begin pmatrix x y end pmatrix A begin pmatrix x y end pmatrix 其中矩陣 A 為 A sum_u sum_v w uv begin bmatrix I_x2 I_x I_y I_x I_y I_y2 end bmatrix begin bmatrix langle I_x2 rangle langle I_x I_y rangle langle I_x I_y rangle langle I_y2 rangle end bmatrix 式子中的矩陣是 Harris 矩陣，而括號代表對所有的 uv 取加權平均， 一個角 或者說是要點 可以被刻劃成該點 uv 使得 S uv 在不同的方向 xy 之間有很大的變異數的點。 根據分析 A 的特徵值，以上的特性可以用下面的方式闡述：在角的點上，A 應該要有兩個 大 的特徵值。 根據特徵值的大小，我們會有以下的推論： 如果 lambda_1 approx 0 和 lambda_2 approx 0 則這個畫素 uv 只是一個普通的點。 如果 lambda_1 approx 0 但 lambda_2 為一個大的正數，則這個畫素 uv 位在邊上面。 如果 lambda_1 和 lambda_2 都是大的正數，則這個畫素 uv 就是一個角點。 Harris 和 Stephens 注意到計算特徵值在運算量上面相當大，計算中需要使用到取平方根的操作，因此給出了另一個近似值 M_c ，其中 kappa 是需要調整的重要引數。 M_c lambda_1 lambda_2 kappa lambda_1 lambda_22 operatorname detA kappa operatorname trace2 A 因此該演演算法不需要真正的去做 A 的特徵分解，而只需要去估計 A 的行列式和跡。 ShiTomasi 角檢測在假設一般影像每個畫素所給出的函式值通常是光滑 smooth 且穩定的 stable，他直接去計算 min lambda_1 lambda_2 ，有時又稱該方法為 KanadeTomasi 角檢測。 而 kappa 的值通常是由經驗決定，而通常在 004015 的範圍裡是可解的。 另一種方法可以避開選擇 kappa 的困擾，這個方法是使用 Nobles 角測度 M_c ，而角測度是計算所有特徵值 的調和平均數 M_c 2 frac operatorname detAoperatorname traceA epsilon 其中 epsilon 是一個小的正常數。 而角的位置的共變異數矩陣即為 A1 ，可以寫成 frac 1langle I_x2 rangle langle I_y2 rangle langle I_x I_y rangle2 begin bmatrix langle I_y2 rangle langle I_x I_y rangle langle I_x I_y rangle langle I_x2 rangle end bmatrix Förstner 角檢測 在某些情況，會希望更精確地去計算角的位置，為了得到近似值，Förstner 演演算法可以解出閉集上的角附近範圍中的所有切線與最接近這些切線的點，該演演算法依賴於在一個理想的角附近。 一個畫素 mathbf x 的切線 T_mathbf xmathbf x 可以由數學式給出 T_mathbf xmathbf xnabla I mathbf xtopmathbf xmathbf x0 其中 nabla I mathbf xI_mathbf xI_mathbf ytop 是影像 I 在 mathbf x 點的梯度向量。 而最靠近長方形範圍 N 中所有切線的點 mathbf x_0 為 mathbf x_0underset mathbf xin mathbb R2times 1operatorname argminint_mathbf xin N T_mathbf xmathbf x2 dmathbf x mathbf x_0 到切線 T_mathbf x 的距離依照梯度向量的大小來加權，因此若經過該點的切線有較大的梯度的話，在加權上就會佔較高的比重。 嘗試著解 mathbf x_0 ： begin align mathbf x_0underset mathbf xin mathbb R2times 1operatorname argmin int_mathbf xin Nnabla I mathbf xtopmathbf xmathbf x2 dmathbf x underset mathbf xin mathbb R2times 1operatorname argminint_mathbf xin Nmathbf xmathbf xtopnabla I mathbf xnabla I mathbf xtopmathbf xmathbf x dmathbf x underset mathbf xin mathbb R2times 1operatorname argmin mathbf xtop Amathbf x2mathbf xtopmathbf bc end align Ainmathbb R2times 2textbf binmathbb R2times 1cinmathbb R 分別為 begin align Aint nabla I mathbf xnabla I mathbf xtop dmathbf x mathbf bint nabla I mathbf xnabla I mathbf xtopmathbf x dmathbf x cint mathbf xtopnabla I mathbf xnabla I mathbf xtopmathbf x dmathbf x end align 要找出最小值可以經由計算式子對 x 的微分，並讓微分後的式子等於 0 來解 x 2Amathbf x2mathbf b0 Rightarrow Amathbf xmathbf b 注意到如果要能夠解上述等式， Ainmathbb R2times 2 必須要是可逆的，或是說 Ainmathbb R2times 2 必須要是滿秩的，而解可以寫成 x_0A1mathbf b 只有在範圍 N 之中有角時才存在。 此外 Lindeberg 給出一個方法去評估角的確定性，經由最小化誤差 tilde d_min frac c bT A1 bmbox trace A 而這對所有尺度都適用，因此這方法可以自動去適應圖片中不同梯度大小所造成的影響與誤差。 此外 c 可以被視為最小平方誤差計算中的誤差，因此當 c 為 0 時，將沒有誤差存在。 這個演演算法可以用來找出環狀特徵的中心，只需將上述演演算法中的梯度向量改成法線向量即可。 多尺度 Harris 運算元 Harris 運算元中的微分矩陣 A 會牽涉到要計算影像中的偏微分 Image derivatives I_x I_y，而這可以用附近點的線性組合來做逼近，而計算線性組合時通常也會需要根據附近影像值的大小來做縮放，因此需要兩個額外的縮放引數：i 一個區域性縮放引數主要用來讓影像平滑一點 ii 一個積分引數用來累積在微分操作中的非線性運算元，作為影像的修正項。 若以 I 代表原本圖形中的亮度，L 為一個將影像 I 透過一個高斯濾波器讓影像變模糊的結果。 g x y t frac 12 pi t ex2y22t 而引數 t 用來控制高斯濾波器的變異數 L x y t g x y t I x y 令 L_x partial_x L 和 L_y partial_y L 為 L 的偏導數，此外用一個高斯濾波器作為縮放大小，引數 s 可供調整。 則 multiscale secondmoment matrix 可以被定義為 mu x y t s int_xi inftyinfty int_eta inftyinfty begin bmatrix L_x2 xxi yeta t L_x xxi yeta t L_y xxi yeta t L_x xxi yeta t L_y xxi yeta t L_y2 xxi yeta t end bmatrix g xi eta s dxi deta 則我們也可以用前面類似的方法來計算 mu 的特徵值，並且定義多尺度 Harris corner 測度為 M_c x y t s operatorname detmu x y t s kappa operatorname trace2 mu x y t s 注意到區域性尺度引數 t 和積分尺度引數 s ，這兩個引數通常會有相對關係 s gamma2 t，其中 gamma 為一個引數通常介於 1 2 之間。 因此我們可以計算多尺度 Harris corner 測度 M_c x y t gamma2 t ，在給定的任何區域性尺度 t 去做到多尺度角偵測。 一般實際應用上，多尺度角偵測通常會先做尺度選擇的步驟，可以參考正規化尺度拉普拉斯運算元 。 nabla2_norm L x y t t nabla2 L x y t t L_xxx y t L_yyx y t 常常在尺度選擇的部分用到，並且用來同時調整尺度以適應該角點。 空間範圍內多尺度角測度 M_c x y t gamma2 t 的最大值： hat x hat y t operatorname argmaxlocal_x y M_c x y t gamma2 t 將影像透過一個高斯濾波器 nabla2_normx y t 拉普拉斯運算元 所得到的 L 的區域性最大值或最小值： hat t operatorname argmaxminlocal_t nabla2_norm L hat x hat y t 參考文獻 引用 來源 Category 特徵檢測 計算機視覺