尋找邊緣的傳統方法,比如圖像中的暗/亮過渡部分,是應用邊緣濾波器。這些過濾器的作用是尋找明暗交界處的像素。用數學術語來說,這些濾波器決定了圖像的梯度。這個圖像梯度通常是邊緣振幅與/或邊緣方向,通過選擇所有具有高邊緣振幅的像素,可以提取出區域之間的輪廓線。HALCON提供了所有標准的邊緣過濾器,如 Sobel, Roberts, Robinson, Frei filters。除此以外,還提供滯后閾值和非最大抑制等后處理操作。此外,還提供了精確確定邊緣振幅和邊緣方向的最先進的濾波器。請注意,除了這種經典的方法外,HALCON還提供了先進的運算器,用於亞像素精確的邊緣和線條提取(下次講解),以及連續的后處理和特征提取.
圖片為應用邊緣濾波器的結果,a.邊緣增幅,b.邊緣方向,c.圖像邊緣
基本概念
使用邊緣濾波器通常包括三個基本步驟。
獲取圖像
首先,獲取一個圖像。
過濾圖像
在輸入圖像上,應用一個邊緣濾波器。這個操作的結果是一或兩個圖像。其基本結果是邊緣振幅,它通常被存儲為一個字節圖像,每個像素的灰度值代表當前的邊緣振幅。也可以選擇返回邊緣的方向。這些值被存儲在一個方向圖像中,其值為0...179,代表除以2的角度。
提取邊緣
應用邊緣濾波器的結果是一個包含邊緣振幅的圖像。從這個圖像中,通過選擇具有一定幅度的像素來提取邊緣。通過使用閾值運算器選擇具有給定最小邊緣振幅的像素來提取邊緣。所得到的邊緣通常比一個像素更寬,因此必須進行減薄處理。對於這個步驟,有各種方法可供選擇。
第一個例子
下面的程序展示了一個關於邊緣濾波器基本概念的例子。作為一個邊緣濾波器,sobel_amp以 "thin_sum_abs "模式應用,以獲得薄的邊緣和一個3x3的濾波器掩碼。然后,操作符threshold被用來提取所有邊緣振幅大於20的像素。得到的區域包含一些邊緣寬於一個像素的區域。因此,運算符skeleton被應用來完全減薄邊緣。
read_image (Image, 'fuse')
sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3)
threshold (EdgeAmplitude, Region, 20, 255)
skeleton (Region, Skeleton)
擴展概念
使用感興趣區域
邊緣提取可以通過使用感興趣的區域來加快速度。邊緣過濾的區域越多邊緣過濾的區域就越受限制,提取的速度就越快、越穩健。
濾波器圖像
HALCON提供了大量的邊緣濾波器。最受歡迎的濾波器之一是Sobel濾波器。這是最好的的老式濾波器。它結合了速度和質量。相應的運算符為sobel_amp和sobel_dir。相比之下,edges_image提供了最先進的邊緣過濾器。這個運算符實際上不僅僅是一個過濾器。它包括使用非最大壓制和滯后閾值對邊緣進行減薄,以達到選擇重要的邊緣點。它還能非常准確地返回邊緣方向和邊緣振幅,這是Sobel濾波器所不具備的。如果更高的質量比更長的執行時間更重要的話,建議使用這個運算器。如果圖像沒有噪音或模糊,你甚至可以將准確性和速度結合起來,通過在edges_image里面使用模式'sobel_fast'來尋找多通道圖像中的邊緣。例如,彩色圖像,相應的運算符是edges_color.
提取邊緣
從邊緣振幅圖像中提取邊緣的最簡單方法是應用threshold來選擇具有數值高的邊緣振幅。這一步的結果是一個包含所有邊緣點的區域。使用skeleton,這些邊緣可以被減薄到一個像素的寬度。作為閾值的一個高級版本,hysteresis_threshold可以用來消除不重要的邊緣。另一個高級選項是在skeleton前調用運算符nonmax_suppression_dir,這在復雜情況下可能會產生更精確的邊緣。請注意,為了使用這個運算符必須先計算邊緣方向圖像。相比之下,高級過濾器edges_image已經包括非最大抑制和滯后的閾值。因此,在這種情況下,一個簡單的threshold就足以提取一個像素寬的邊緣。如果只需要一個區域的邊緣點,可以使用操作符inspect_shape_model。在這里,所有的步驟包括邊緣過濾、非最大抑制和滯后閾值都在一個步驟中進行,效率很高。
處理邊緣
如果你想提取邊緣段的坐標,split_skeleton_lines是正確的選擇。這個運算符必須為每個連接的組件(connection的結果)調用,並返回線段的所有控制點。作為一種替代方法,可以使用Hough變換來獲得線段。這里,運算符hough_lines_dir和hough_lines是可用的。你也可以通過將邊緣區域轉換成XLD等值線使用,例如,運算符gen_contours_skeleton_xld。這種方法的優點是為XLD輪廓處理提供了一組擴展的操作符,例如,用於輪廓分割、特征提取或近似處理。
你可以使用background_seg輕松地提取邊緣所包圍的區域。如果區域因為邊緣的間隙而合並,可以在提取區域之前提前使用操作符close_edges或close_edges_length來關閉間隙.在區域被提取之前,可以提前使用close_edges或close_edges_length運算符來關閉間隙。作為一種替代方法,像Opening_circle這樣的形態學運算符可以用於
輸出區域.
顯示結果
最后,顯示圖像、邊緣(區域)和線段。
下節進行相關案例講解