影像分析,使用Halcon進行缺陷檢測

大資料高階架構師發表於2018-10-16

1.首先簡單介紹一下Halcon開發:

        HALCON是德國MVtec公司開發的一套完善的標準的機器視覺演算法包,擁有應用廣泛的機器視覺整合開發環境。它節約了產品成本,縮短了軟體開發週期——HALCON靈活的架構便於機器視覺,醫學影像和影像分析應用的快速開發。在歐洲以及日本的工業界已經是公認具有最佳效能的Machine Vision軟體。

Halcon語句的分類:

  1. 綠色:註釋
  2. 褐色:控制和開發運算元
  3. 藍色:影像獲取和處理運算元
  4. 淺藍色:外部函式

     如圖所示: 

Halcon語句的分類
Halcon語句分類示例

Halcon影像處理思想

    1.獲取影像
    2.預處理
    3.處理
    4.顯示結果和清除object

影像的特徵

1.顏色物徵:邊緣、頻譜、色彩,角點
2.形態學特徵:輪廓,形狀
3.紋理物徵
4.空間關係

例程:detect_indent_fft.hdev

* This program demonstrates how to detect small texture
* defects on the surface of plastic items by using the fast
* fourier transform (FFT).
* First, we construct a suitable filter using Gaussian
* filters. Then, the images and the filter are convolved
* by using fast fourier transforms. Finally, the defects
* are detected in the filtered images by using
* morphology operators.
* 
* Initializations
*/
*例程:detect_indent_fft.hdev

* 說明:這個程式展示瞭如何利用快速傅立葉變換(FFT)對塑料製品的表面進行目標(缺陷)的檢測,大致分為三步:

* 首先,我們用高斯濾波器構造一個合適的濾波器(將原圖通過高斯濾波器濾波);

* 然後,將原圖和構造的濾波器進行快速傅立葉變換;

* 最後,利用形態學運算元將缺陷表示在濾波後的圖片上(在缺陷上畫圈)。
*
*/

* 在程式執行過程中選擇將PC更新操作開啟或關閉
dev_update_off ()
* 關閉啟用的圖形顯示視窗
dev_close_window ()
read_image (Image, 'plastics/plastics_01')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* dev_set_draw (’fill’)    填滿選擇的區域
* dev_set_draw (’margin’)    顯示的物件只有邊緣線,
dev_set_draw ('margin')
* 線寬用Line Width 指定
dev_set_line_width (3)
* 指定顏色
dev_set_color ('red')
* 
* Optimize the fft speed for the specific image size
* 對指定大小的圖片的fft速度進行優化
optimize_rft_speed (Width, Height, 'standard')
* 
* Construct a suitable filter by combining two gaussian
* filters
* 定義兩個常量
Sigma1 := 10.0
Sigma2 := 3.0
* 構造兩個高斯濾波器
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)

* 兩圖片相減(灰度)
sub_image (GaussFilter1, GaussFilter2, Filter, 1.025, 0)
* sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
* g' := (g1 - g2) * Mult + Add
* 以上為函式原型以及運算公式
* 
* Process the images iteratively
NumImages := 16
for Index := 1 to NumImages by 1
    * 
    * Read an image and convert it to gray values
    read_image (Image, 'plastics/plastics_' + Index$'02')
    * 把一個RGB影像轉變成一個灰度影像。
    rgb1_to_gray (Image, Image)
    * Perform the convolution in the frequency domain
    * 計算一個影像的實值快速傅立葉變換。
    rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
    * 用在頻域內的濾波器使一個影像卷積。
    convol_fft (ImageFFT, Filter, ImageConvol)
    rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
    * 
    * Process the filtered image
    * 用一個矩形掩膜計算畫素點的灰度範圍
    gray_range_rect (ImageFiltered, ImageResult, 10, 10)

    * 決定區域內最小最大灰度值
    intensity(ImageResult, ImageResult, MeanValue, Deviation)
    min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
    * 利用全域性閾值對影像進行分割
    * value := 10
    * if (Max > 6.8)
    *     value := 6.8
    * else
    *     value := Max * 0.8
    * endif
    threshold (ImageResult, RegionDynThresh, max([5.55, MeanValue + 4.25]), 255)
    * threshold (ImageResult, RegionDynThresh, max([5.55, Max * 0.8]), 255)

    * 計算區域內的連通部分
    connection (RegionDynThresh, ConnectedRegions)
    * 根據指定的形態特徵選擇區域
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1, 99999)
    * 返回包含所有區域的集合
    union1 (SelectedRegions, RegionUnion)
    * 用一個圓圈來封閉一個區域
    * 引數說明:將要被封閉的區域(RegionUnion)
    *          被封閉的區域(RegionClosing)
    *          圓圈的半徑(10)
    closing_circle (RegionUnion, RegionClosing, 5)
    * 合併畫素相連區成為一個Element
    connection (RegionClosing, ConnectedRegions1)
    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
    * 計算區域的面積以及中心位置
    area_center (SelectedRegions1, Area, Row, Column)
    * 
    * Display the results
    * 顯示原圖
    dev_display (Image)
    * 將區域面積賦給Number用於後面檢查是否存在缺陷
    Number := |Area|  
    if (Number)
        * 構造一個與設定的圓弧或圓相一致的邊界
        gen_circle_contour_xld (ContCircle, Row, Column, gen_tuple_const(Number,30), gen_tuple_const(Number,0), gen_tuple_const(Number,rad(360)), 'positive', 1)
        ResultMessage := ['Not OK',Number + ' defect(s) found']
        Color := ['red','black']
        dev_display (ContCircle)
    else
        ResultMessage := 'OK'
        Color := 'forest green'
    endif
    * 顯示資訊
    disp_message (WindowHandle, ResultMessage, 'window', 12, 12, Color, 'true')
    if (Index != NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor

執行效果圖:

 

 

 

相關文章