5.14. 高斯平滑化與邊緣¶
在經典機器視覺中,鄰域視窗的用途主要由兩項工作主導:乾淨地平滑像素之間的變化,以及找出影像劇烈變化處的邊緣。高斯濾波器是前者的標準工具,以拉普拉斯為基礎的偵測器則是後者的標準工具——而這兩者可以組合運用,因為每個邊緣偵測器在經過輕度平滑的輸入上都運作得更好。
5.14.1. 高斯濾波器¶
gaussian() 是 mean() 的中心加權版本。兩者都會對每個像素的鄰域計算平均值,但高斯的權重並非均勻:越靠近鄰域中心的像素佔比越大,位於鄰域邊緣的像素佔比越小,這些權重遵循那條為此濾波器命名的熟悉鐘形曲線。
正是這種鐘形權重,讓高斯濾波器比盒狀平均更平滑。平均值濾波會在物體邊緣產生可見的瑕疵——權重中的硬性截斷會在劇烈過渡處引入細微的振鈴模式。高斯平滑下降的權重避免了這種振鈴,並產生一個更貼近「模糊」應有樣貌的結果。代價是每像素的運算量比平均值濾波器多,但差距並不大——其每像素成本仍遠低於雙邊濾波器。
img.gaussian(1) # 3x3 Gaussian -- a clean light blur
img.gaussian(2) # 5x5 Gaussian -- stronger smoothing
高斯平滑化是幾乎每個邊緣偵測管線的標準第一階段。下文的邊緣偵測器全都會放大高頻內容,包括演算法其實並不想偵測的感測器雜訊。先執行一次輕度的高斯能在不太軟化真實邊緣的前提下抑制這些雜訊,讓邊緣偵測器去找出真正的邊緣而非雜點。
5.14.2. 反銳化遮罩¶
影像的高斯模糊副本是經典銳化所用的反銳化遮罩(unsharp mask)技術的原料。在濾波器上設定 unsharp=True 會將它從「產生模糊影像」切換為「從原始影像中減去模糊影像,再把差值加回原始影像」——其效果是讓高頻邊緣相對於平滑的內部區域被放大。
img.gaussian(1, unsharp=True)
選用的 mul 與 add 參數可縮放反銳化結果的強度;預設值(mul=1.0、add=0.0)是一種不會誇大感測器雜訊的適度銳化。
5.14.3. 拉普拉斯濾波器¶
laplacian() 會執行影像二階空間導數的離散近似。輸出在像素值快速變化處很大,在像素值恆定或線性變化處則趨近於零。對結果最自然的解讀就是一種邊緣響應:影像快速變化處的像素會亮起,平滑內部區域的像素則維持暗色。
img.laplacian(1) # 3x3 Laplacian -- edge response
可使用與 gaussian 相同的參數。sharpen=True 會產生一張銳化後的影像(拉普拉斯結果被加回原始影像,而非單獨回傳)。mul 與 add 則縮放其響應。
邊緣偵測之外的一個實用用途是對焦量測。將某個區域內的拉普拉斯響應加以平均,可粗略衡量該區域承載多少高頻內容;在對焦良好的影格上,這個平均值很高,在模糊的影格上則會下降。比較不同影格之間的拉普拉斯響應,是一種無需更昂貴的對比度指標即可詢問「鏡頭有對焦嗎?」的廉價方法。
5.14.4. find_edges 方法¶
find_edges() 執行的是一條完整的邊緣偵測管線,而不僅僅是一個邊緣響應濾波器。它適用於灰階影像,其結果是一張二值影像,其中非零像素標記出輸入影像中具有應視為邊緣的那種亮度變化的位置。
此方法接受一個 edge_type 參數,用以在兩種演算法之間做選擇:
EDGE_SIMPLE 會執行一個高通濾波器、套用一個閾值,然後回傳結果。它很快,但輸出包含每一個高於閾值的亮度變化,包括應用程式很可能並不在意的雜訊與紋理。對於乾淨的影像,以及雜訊將由後續形態學處理清除的情況,這個選擇是合理的。
EDGE_CANNY 會執行 Canny 邊緣偵測器——那個經典的多階段演算法。它會計算亮度梯度、沿著梯度方向抑制每一個非極大值響應(使每條邊緣寬度為一個像素),並套用一個遲滯閾值(使一條在某處很強的邊緣即便在其消退的地方也會被追蹤下去)。其結果是一組乾淨、纖細、相連的邊緣像素,正是每個經典的以邊緣為基礎的演算法所想要的。
threshold 參數是一個雙元素的元組 (low, high)。對於 EDGE_CANNY,high 值是高於它就肯定為邊緣的切割點,而 low 值則是高於它、但只有在連到某個肯定的邊緣時才算邊緣的切割點。對於 EDGE_SIMPLE,只有 high 值有意義;它是高於它就將像素計為邊緣的單一切割點。預設的 (100, 200) 是一個值得針對特定場景進行調校的起點。
img.gaussian(1) # pre-smooth
img.find_edges(image.EDGE_CANNY, threshold=(50, 100))
在幾乎所有重視邊緣的應用中,Canny 偵測器都是較佳的選擇。比較快的 EDGE_SIMPLE 則值得記在心裡,以備在 Canny 的成本成為問題、且其遲滯處理的雜訊排除其實並不需要的那些情況下使用。
5.14.5. 對高斯結果進行自適應閾值處理¶
與 統計濾波器 一樣,gaussian() 也接受用於自適應閾值的 threshold=True / offset=N 關鍵字組。其行為與 mean() 相同:每個位置上的高斯統計量成為該處的本地切割點,而來源像素則與該統計量加上偏移量做比較,以產生二值結果。
當輸入相當無雜訊時,高斯變體通常是自適應閾值最乾淨的選擇。其加權平均所給出的切割點比平均值濾波器所產生的更平滑,在劇烈的光照過渡處也有較少的瑕疵。