1. 程式人生 > >網格缺陷檢測(高斯混合模型GMM)

網格缺陷檢測(高斯混合模型GMM)

*此示例程式向您展示如何使用GMM分類器進行新穎性檢測以執行Web檢查任務。 要進行新奇檢測,
*計算屬於單個訓練類的所有畫素,然後進行計算從分類ROI中減去以提取錯誤畫素。 對於網路檢查任務,GMM因此可用於檢測紋理與訓練好的物體的紋理不對應。

                  

read_image (Image, 'plastic_mesh/plastic_mesh_01')

get_system ('example_dir', HalconExamples)
*用於分類的紋理過濾器將返回影象處的偽像邊界,因為要檢查的塑料網的影象不包含整數個網格單元格。 因為這會導致錯誤的檢測到影象邊界處的錯誤,我們必須排除靠近的區域影象邊界來自訓練和分類。 這是通過以下方式完成的長方形。 請注意,影象後來縮小了兩倍。


gen_rectangle1 (Rectangle, 10, 10, Height / 2 - 11, Width / 2 - 11)

                                 

* 建立GMM模型,5個訓練的特徵向量,1個樣本分類,高斯中心範圍[1,5],協方差矩陣'Spherical',預處理normalization”,5個特徵向量所指向的元件數,種子隨機數初始化42
    create_class_gmm (5, 1, [1,5], 'spherical', 'normalization', 5, 42, GMMHandle)
 
  *從5張圖片抽取特徵


    for J := 1 to 5 by 1

                   
        read_image (Image, 'plastic_mesh/plastic_mesh_' + J$'02')
       *縮小圖片,加快速度
        zoom_image_factor (Image, ImageZoomed, 0.5, 0.5, 'constant')
   
        gen_texture_image (ImageZoomed, ImageTexture)

******************************************************************************************************************************

* The texture image is a five-channel image that contains the result of applying
* five different Laws filters, which basically correspond to first and second
* derivatives, and smoothing them sufficiently.

*紋理影象是包含應用結果的五通道影象
*五種不同的法律過濾器,基本上對應於第一和第二
*衍生物,並充分平滑它們。

紋理分析是影象處理中的一種典型任務,texture_laws是Halcon中紋理分析的重要運算元,其本質原理是利用不同的kernel與影象進行卷積運算,提取出影象的高頻部分或低頻部分。

紋理(texture)由紋理單元(texel)組成,紋理單元是紋理影象中最小的重複單元,texel是紋理的基本單元。

紋理分析的第一種典型應用是利用紋理濾波器對影象進行濾波處理,以增強(enhance)或抑制(suppress)特定的紋理。濾波後的影象通過blob analysis或者分類演算法,將具有相同紋理的部分分割為同一區域(region)。

第二種典型應用是計算影象的紋理特徵用於影象的分類,紋理濾波器作為預處理濾波器來增強(enhance)或抑制(suppress)特定的紋理。Halcon中標準的紋理特徵(feature)運算元是gen_cooc_matrix(生成共生矩陣),另一個常用的運算元是entropy_gray(灰度熵,用於計算影象的平均資訊量(entropy)和各向異性(anisotropy))。

texture_laws運算元的語法如下:

texture_laws(Image : ImageTexture : FilterTypesShiftFilterSize : )

Image:原始影象

ImageTexture:經過紋理濾波器濾波後的影象

FilterTypes:濾波器的型別

Shaft:濾波後圖像的灰度縮放係數,具體實現公式未知,實際使用過程中降低了濾波後圖像的灰度,使得使用不同濾波器型別的濾波後圖像具有可比性

FilterSize:濾波器尺寸,可選3,5,7

濾波器型別由濾波向量(vector)的兩個字母組成,第一個字母表示在列方向的濾波器向量,第二個字母表示在行方向的濾波器向量。處理過程中,先對影象的一個方向進行濾波(具體從列方向還是行方向開始未知),再對影象的另一個方向進行濾波。

以3x3的濾波器矩陣為例:

l = [  1 2  1 ],

e = [ -1 0  1 ],

s = [ -1 2 -1 ]

濾波向量l增強濾波方向的影象的亮度。濾波向量e檢測了濾波方向上的突變(即邊緣,高頻區域)。濾波向量s同樣檢測了濾波方向上的突變(與濾波向量e檢測方法不一樣)。濾波後圖像很容易溢位(這不是個準確說法,實際意義是對於byte型別的影象,灰度值超過了255),因此需設定合適的shaft值縮放灰度值。

一般來說,可以選擇濾波向量中的 "l", "e", "s", "r", "w", "o"與濾波向量"l"組合來增強影象的低頻部分,或者與濾波向量"o"組合來增強影象的高頻部分。

濾波器型別的第二個字母"l", "e", "s", "r", "w", "o"依次檢測影象低頻部分到高頻部分。例如,濾波器"le"檢測影象 中相對低頻的部分,而濾波器"ls"檢測影象中相對高頻的部分。


texture_laws (Image, ImageEL, 'el', 5, 5)

                 
texture_laws (Image, ImageLE, 'le', 5, 5)

                
texture_laws (Image, ImageES, 'es', 1, 5)

               
texture_laws (Image, ImageSE, 'se', 1, 5)

              
texture_laws (Image, ImageEE, 'ee', 2, 5)

            

*把5張圖片合成一個圖片的通道
compose5 (ImageEL, ImageLE, ImageES, ImageSE, ImageEE, ImageLaws)

           

*高斯平滑,過濾高頻,剩下低頻
smooth_image (ImageLaws, ImageTexture, 'gauss', 5)

           
return ()

 

******************************************************************************************************************************
        * Add the samples to the classifier.

*把抽取的特徵影象和要處理的區域新增到高斯模型中去,高斯模型的標準偏差是2
        add_samples_image_class_gmm (ImageTexture, Rectangle, GMMHandle, 2.0)

                       

                                                                           特徵圖

                                                           

                                                                                    區域


    endfor

*訓練高斯模型

迭代次數是1000,期望誤差閾值是0.001,'training'發生的概率是依據樣本中的概率推斷,

Regularize:預設值0.0001,防止計算中出現奇異協方差矩陣。增加到協方差矩陣的對角線上的一個很小的值

輸出引數,輸出類的中心個數,迭代次數

 train_class_gmm (GMMHandle, 1000, 0.001, 'training', 1e-4, Centers, Iter)

*測試圖片

for J := 1 to 14 by 1
    read_image (Image, 'plastic_mesh/plastic_mesh_' + J$'02')
    zoom_image_factor (Image, ImageZoomed, 0.5, 0.5, 'constant')
    dev_display (ImageZoomed)
    gen_texture_image (ImageZoomed, ImageTexture)

                  
    reduce_domain (ImageTexture, Rectangle, ImageTextureReduced)

                    
    * Classify samples belonging to the trained class with the GMM.
    classify_image_class_gmm (ImageTextureReduced, Correct, GMMHandle, 0.001)

                  
    * Subtract them from the ROI to obtain the texture errors.

*/用原來畫的檢測區域減去分類出來的區域
    difference (Rectangle, Correct, Errors)
    * Postprocess the returned raw errors to remove insignificant parts of the
    * detected errors.

*開運算,閉運算
    opening_circle (Errors, ErrorsOpening, 3.5)
    closing_circle (ErrorsOpening, ErrorsClosing, 10.5)
    connection (ErrorsClosing, ErrorsConnected)

*篩選面積大於300的就是缺陷
    select_shape (ErrorsConnected, FinalErrors, 'area', 'and', 300, 1000000)
    count_obj (FinalErrors, NumErrors)
    dev_set_color ('red')
    dev_set_draw ('margin')
    dev_set_line_width (3)
    dev_display (FinalErrors)

                 
    if (NumErrors > 0)
        disp_message (WindowHandle, 'Mesh not OK', 'window', 10, 10, 'black', 'true')
    else
        disp_message (WindowHandle, 'Mesh OK', 'window', 10, 10, 'black', 'true')
    endif
    if (J < 14)
        disp_continue_message (WindowHandle, 'black', 'true')
    endif
    stop ()
endfor
clear_class_gmm (GMMHandle)