5.8. 漫水填充與偵測圖示

本節開頭的幾何基元會在應用程式已知的位置上做標記。影像合成則把一張影像疊到另一張之上。最後一小組繪圖方法做的是不同的事:它所做的標記,其形態取決於影像中已經存在的內容,或某個先前演算法在影像中找到的東西。

5.8.1. 漫水填充

flood_fill() 從單一像素——即種子——出發向外擴展,將每個與種子足夠相似、且透過一連串其他相似像素與其相連的像素都塗上顏色。結果是一個填充區域,其邊界由影像本身決定,而非由傳入呼叫的任何參數決定。

最簡單的形式接受種子座標與要填充的色彩:

img.flood_fill(x=160, y=120, color=(0, 255, 0))

兩個閾值參數控制填充擴展的積極程度。seed_threshold(從 0.01.0 的正規化分數)設定一個像素與原始種子值相差多少仍可被納入。floating_threshold 則設定它與每個已納入鄰居相差多少仍可納入。這兩個閾值協同運作:寬鬆的 floating_threshold 讓填充得以沿著影像中的漸層延伸,而緊湊的 seed_threshold 則即使沿著該漸層也能避免填充偏離種子值太遠。

幾個旗標可進一步精修結果:

  • invert=True 會塗繪每個匹配的像素——即匹配區域的補集——而非匹配像素本身。

  • clear_background=True 會將填充區域以外的每個像素歸零。這在僅將填充區域擷取為遮罩時很有用。

  • mask 關鍵字具有其一貫的意義:遮罩中關閉的像素會被保持不動,無論填充原本是否會觸及它們。

漫水填充在兩種模式下最為實用。第一種是視覺化某個區域偵測器找到的內容,做法是用一種獨特色彩填充偵測到的區域,使其在影格其餘部分中突顯出來。第二種是擷取區域本身,做法是把 clear_background=True 與區域內已知的種子結合,再把所得影像當作後續操作的遮罩來讀取。

5.8.2. 繪製偵測結果

影像處理演算法常會回傳同時帶有位置與某些附加結構的結果物件:帶有方向的關鍵點、質心與其邊界框不同的人臉偵測、具有四個角點的 AprilTag。要把這些妥善地繪製出來——用一個能捕捉其結構、而不只是邊界框的圖示——是個常見到足以讓模組為其提供兩個輔助方法的模式。

draw_keypoints() 接受特徵擷取器回傳的關鍵點描述子,或是一份單純的 (x, y, rotation) 三元組清單,並在每個點上繪製一個小圖示。該圖示同時呈現位置與方向:點周圍的一個圓圈,加上一條由中心向外延伸、指示旋轉的線段。這種單次呼叫的視覺化是最簡便的方法,可用來健全性檢查某個關鍵點擷取器是否回傳了應用程式所預期的方向。

draw_detection() 接受一個六元組 (rx, ry, rw, rh, cx, cy)——即邊界矩形加上一個另行回報的質心——並一次繪製兩者:邊界框周圍的一個矩形、質心處的一個十字,以及(可選)矩形角落的一個文字標籤。此形式符合神經網路偵測或範本追蹤器通常回報的內容,在這些情境中,質心是比邊界框中心更精確的位置。

這兩個圖示方法都是本節開頭幾何基元之上的便利層。應用程式隨時都能直接呼叫 draw_rectangle()draw_circle()draw_cross()draw_string() 來重現相同的視覺化;圖示方法只是為這些反覆出現的模式省去了瑣碎的記帳工作。

有了用於已知幾何的幾何基元、用於疊加的影像合成、用於影像衍生區域的漫水填充,以及用於標準視覺化模式的偵測圖示,這套繪圖工具組便已完整。應用程式要讓演算法輸出可見所需的一切,在介面上都有對應的方法可以做到。