《HALCON機器視覺與算法原理編程實踐》第10章 邊緣檢測-學習筆記

10.1 像素級邊緣提取

像素級邊緣提取,直觀點說,也就是顏色的邊緣提取。

10.1.1 經典的邊緣檢測算子

  1. Sobel算子
    Sobel 算子是一個主要用作邊緣檢測的離散微分算子 (discrete differentiation operator)。 它Sobel算子結合了高斯平滑和微分求導,用來計算圖像灰度函數的近似梯度。在圖像的任何一點使用此算子,將會產生對應的梯度矢量或是其法矢量。

  2. Laplce算子
    Laplacian 算子是n維歐幾里德空間中的一個二階微分算子,定義爲梯度grad()的散度div()。

  3. Canny算子
    Canny邊緣檢測算子是John F.Canny於 1986 年開發出來的一個多級邊緣檢測算法。更爲重要的是 Canny 創立了邊緣檢測計算理論(Computational theory ofedge detection),解釋了這項技術是如何工作的。Canny邊緣檢測算法以Canny的名字命名,被很多人推崇爲當今最優的邊緣檢測的算法。

(1)Sobel算子在邊緣檢測的同事儘量減少了噪聲的影響,比較容易實現。效果比較好,是很常用的邊緣檢測方法。
(2)Laplace算子是一種各向同性算子,比較適用於只關心邊緣的位置而不考慮其周圍像素的灰度差值的情況。只適用於無噪聲圖像。存在噪聲的情況下,要先對圖像進行低通濾波處理。
(3)Canny算子是目前理論相對最完善的一種邊緣檢測算法,但也存在不足之處:爲了得到較好的邊緣檢測結果,通常需要使用較大的濾波尺度,這樣容易丟失一些細節。

10.1.2 邊緣檢測的一般流程

  1. 獲取圖像
  2. 選擇感興趣的區域
  3. 圖像濾波
  4. 提取邊緣
  5. 邊緣處理
  6. 顯示結果

10.1.3 sobel_amp算子

sobel_amp - 使用Sobel算子檢測邊緣(幅度)。
sobel_amp(圖片:邊緣圖像:濾波器方式,掩膜大小:)

read_image(Image,'data/flower')
rgb1_to_gray (Image, GrayImage)
sobel_amp(GrayImage,Amp,'sum_abs',3)
threshold(Amp,Edg,100,255)
skeleton (Edg, Skeleton)
dev_clear_window ()
dev_display (Skeleton)

10.1.4 edges_image算子

edges_image(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )

ImaAmp: 輸出變量,說的是edges的amplitude,其實就是梯度的大小(因爲邊緣檢測最重要的幾種方法中一種就是基於灰度值梯度的計算,這個算子中用的那些濾波器就是這樣的)。
ImaDir: 輸出變量,這個呢,說的是edges的方向,其實就是看灰度值變化的方向了,計算出灰度值是從小變大了還是從大變小了。
Alpha: 這個值在使用的時候要注意,小一些的值會導致比較強的平滑,從而圖像中的細節就會變得更少。(和Canny算子正好相反,因爲Canny算子用的是Gauss原理,所以那個值越大越平滑
NMS: 這個變量是用來控制我們是否使用非極大值抑制技術(這個技術主要是在Canny檢測中提出來的)
Low, High: 就是指定一個雙閾值了。

dev_close_window ()
read_image(Image,'data/flower')
rgb1_to_gray (Image, GrayImage)
gen_image_proto (Image, ImageCleared, 1)
dev_open_window (0, 0, 256, 256, 'black', WindowHandle1)
dev_open_window (0, 256, 256, 256, 'black', WindowHandle2)
dev_open_window (0, 512, 256, 256, 'black', WindowHandle3)
edges_image (GrayImage, ImaAmpGray, ImaDirGray, 'canny', 1, 'none', -1, -1)
edges_image (GrayImage, ImaAmpGrayNMS, ImaDirGrayHyst, 'canny', 1, 'nms',20, 40) 
*對非極大值抑制後的邊緣梯度圖像進行了閾值處理
threshold (ImaAmpGrayNMS, RegionGray, 1, 255) 
*提取邊緣輪廓
skeleton (RegionGray, EdgesGray) 
*用於結果顯示和對比
dev_set_window (WindowHandle1)
dev_display (ImageCleared) 
dev_display (ImaAmpGray) 
dev_set_window (WindowHandle2)
dev_display (ImageCleared) 
dev_display (ImaAmpGrayNMS) 
dev_set_window (WindowHandle3)
dev_display (ImageCleared) 
dev_display (EdgesGray)

10.1.5 其它濾波器

  1. derivate_gauss(Image : DerivGauss : Sigma, Component : )
    在這裏插入圖片描述
  2. laplace(Image : ImageLaplace : ResultType, MaskSize, FilterMask : )
    在這裏插入圖片描述
read_image (Image, 'data/flower')
laplace (Image, ImageLaplace, 'signed', 11, 'n_8_isotropic')
zero_crossing (ImageLaplace, RegionCrossing)

3.laplace_of_gauss(Image : ImageLaplace : Sigma : )
在這裏插入圖片描述

10.2 亞像素級邊緣提取

面陣攝像機的成像面以像素爲最小單位。例如某CMOS攝像芯片,其像素間距爲5.2微米。攝像機拍攝時,將物理世界中連續的圖像進行了離散化處理。到成像面上每一個像素點只代表其附近的顏色。至於“附近”到什麼程度,就很難解釋。兩個像素之間有5.2微米的距離,在宏觀上可以看作是連在一起的。但是在微觀上,它們之間還有無限的更小的東西存在。這個更小的東西我們稱它爲“亞像素”。實際上“亞像素”是存在的,只是硬件上沒有個細微的傳感器把它檢測出來,於是軟件上把它近似地計算出來。
Halcon中用XLD表示亞像素的輪廓和多邊形。

10.2.1 edges_sub_pix 算子

edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
https://www.mvtec.com/doc/halcon/13/en/edges_sub_pix.html
在這裏插入圖片描述

read_image (Image, 'data/flower') 
*轉換爲單通道灰色圖像
rgb1_to_gray (Image, GrayImage)
*進行亞像素邊緣提取。分別使用了不同的滯後閾值以便進行對比
edges_sub_pix (GrayImage, Edges1, 'lanser2', 0.5, 5, 50) 
edges_sub_pix (GrayImage, Edges2, 'lanser2', 0.5, 25, 50) 
edges_sub_pix (GrayImage, Edges3, 'lanser2', 0.5, 5, 25) 
*將提取結果顯示在窗口中
dev_display (Edges1) 
stop()
dev_display (Edges2)
stop()
dev_display (Edges3)

10.2.2 edges_color_sub_pix 算子

edges_color_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
https://www.mvtec.com/doc/halcon/13/en/edges_color_sub_pix.html
在這裏插入圖片描述

read_image (Image, 'data/flower') 
*使用canny算子進行亞像素邊緣提取
edges_color_sub_pix (Image, Edges1, 'canny', 0.5, 5, 50)
*使用canny算子進行亞像素邊緣提取
edges_color_sub_pix (Image, Edges2, 'sobel_fast', 0.5, 40, 70)
dev_clear_window ()
dev_display (Edges1) 
dev_display (Edges2)

10.2.3 lines_gauss 算子

lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )
https://www.mvtec.com/doc/halcon/13/en/lines_gauss.html
在這裏插入圖片描述

read_image (Image, 'data/flower') 
rgb1_to_gray (Image, GrayImage)
dev_open_window (0, 512, 512, 512, 'black', WindowHandle1)
*進行邊緣檢測
lines_gauss(GrayImage,Lines,1.5,1,8,'light','true','bar-shaped','true')
*在窗口將輪廓線條繪製出來
dev_set_color ('red')
dev_clear_window()
dev_display (Lines)

10.3 輪廓處理

dev_close_window ()
read_image (Image, 'data/shapes')
rgb1_to_gray (Image, GrayImage)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width , Height, 'black', WindowHandle)
*提取出的亞像素邊緣edge的圖像,得到了一個初始的輪廓
edges_sub_pix (GrayImage, Edges, 'canny', 2.5, 15, 40)
*對上一步的輪廓進行分割
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
*提取出輪廓中較長的部分線段
select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 20, Width / 2, -0.5, 0.5)
*對相鄰的輪廓段進行連接
union_adjacent_contours_xld (SelectedContours, UnionContours, 20, 1, 'attr_keep')
dev_close_window ()
*讀取了圖像並創建顯示窗口
read_image (Image, 'data/flower')
rgb1_to_gray (Image, GrayImage)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width , Height, 'black', WindowHandle)
dev_set_color ('white')
*對圖像進行閾值處理
threshold (GrayImage, Region, 130, 255)
*使用閉運算進行填充
closing_circle (Region, Region, 20.5)
*獲取前景目標的初始輪廓
gen_contour_region_xld (Region, Contour, 'border')
*擬合圓形輪廓
fit_circle_contour_xld (Contour, 'atukey', -1, 2, 0, 10, 1, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
*生成該擬合的圓形輪廓
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 4 * acos(0), 'positive', 1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章