1. 程式人生 > >Halcon學習筆記之缺陷檢測(布匹、皮革、塑料)

Halcon學習筆記之缺陷檢測(布匹、皮革、塑料)

例程:detect_indent_fft.hdev

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

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

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

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

:程式碼中綠色部分為個人理解和註釋,其餘為例程中原有程式碼

*Initialization(初始化)
dev_updata_off()      //這一句包含如下三個運算元:
//dev_updata_pc(‘off’)        關閉更新程式計數器
//dev_updata_var(‘off’)       關閉更新變數視窗
//dev_updata_window(‘off’)    關閉更新影象視窗(即通過命令來顯示想要在影象視窗顯示的圖片)
dev_close_window()    //關閉活動的影象視窗
read_image(Image,’plastics
/
plastics_01’) //載入圖片
//引數說明:為讀入圖片命名(Image)
//         檔名(’plastics/plastics_01’)
get_image_size(Image,Width,height)        //獲取圖片的長寬;
//引數說明:之前讀入或生成的圖片(Image)
//           圖片的寬(Width)
//           圖片的高(Height)
dev_open_window(0,0,Width,Height,’Black’,WindowHandle)  //開啟一個新的影象視窗
//引數說明:起始座標(0,0)
//            大小(Width,Height)
//            背景顏色(’Black’)
//            視窗控制代碼(WindowHandle)
set_display_font (WindowHandle,14,’mono’,’ture’,’false’)//設定不依賴作業系統的字型
//引數說明:視窗控制代碼(WindowHandle)
//            字型大小(14)
//            字型型別(’mono’)
//            是否黑體(’ture’)
//            是否傾斜(’false’)
dev_set_draw(‘Margin’)        //定義區域填充模式
//引數說明:填充模式(’Margin’或者’Fill’)

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’)    //對指定大小的圖片的fft速度進行優化
//引數說明:圖片大小(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)                            //在頻域生成兩個高斯濾波器
//引數說明:生成的高斯濾波器(GaussFilter)
//            空域中高斯在主方向上的標準差(Sigma)
//            空域中高斯在正交於主方向的方向上的標準差(Sigma)
//            濾波器主方向的角度(0.0)
//            濾波器的規範(’none’)
//            直流項在頻域的位置(’rft’)
//            圖片的大小(Width,Height)
sub_image(GaussFilter1,GaussFilter2,Filter,1,0)    //兩圖片相減(灰度)
//sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
//g' := (g1 - g2) * Mult + Add
//以上為函式原型以及運算公式
*
*Process the images iteratively(對影象進行迭代運算)
NumImages := 11
For Index := 1 to NumImages by 1        //for迴圈從1到NumImages,步長為1
   *
   *Read an image and convert it to gray values
   read_image(Image,’plastics/plastics_’+Index$’02’)
   rgb1_to_gray(Image,Image)            //將原圖轉化為灰度圖,第一個引數為原圖
   *Perform the convolution in the frequency domain
   rft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)//對計算一幅圖片實部進行快速傅立葉變換
   //引數說明:輸入的圖片(Image)
   //            傅立葉變換後輸出的圖片(ImageFFT)
   //            變換方向(’to_freq’或’from_freq’)
   //            變換因子的規範(’none’)
   //            輸出圖片的資料型別(’complex’)
   //            圖片的寬(Width)
   convol_fft(ImageFFT,Filter,ImageConvol)    //對圖片用一個濾波器在頻域進行卷積運算
   //引數說明:輸入的圖片(ImageFFT)
   //            頻域濾波器(Filter)
   //            運算後輸出的結果
   rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width)    //對濾波後的圖片進行傅立葉反變換
   *
   *Process the filtered image
   gray_range_rect(ImageFiltered,ImageResult,10,10)//用一個矩形掩膜計算畫素點的灰度範圍
   //引數說明:輸入的圖片(ImageFiltered)
   //            輸出的灰度範圍圖(ImageResult)
   //            矩形掩膜大小(10,10)
   min_max_rect(ImageResult,ImageResult,0,Min,Max,Range)//判斷區域內灰度值的最大和最小值
   //引數說明:待分析圖片區域(ImageResult)
   //            圖片(ImageResult)
   //            被去除的直方圖兩邊畫素點所
   //            佔總畫素數的百分比(0)
   //            得到的最小值最大值及灰度值範圍(Min,Max,Range)
   threshold(ImageResult,RegionDynThresh,max([5.55,Max*0.8]),255)//利用全域性閾值對影象進行分割
   //引數說明:輸入的圖片(ImageResult)
   //            分割後得到的區域(RegionDynThresh)
   //            閾值(max([5.55,Max*0.8]),255)
   //            公式:MinGray <= g <= MaxGray
   connection(RegionDynThresh,ConnectedRegions)    //計算區域內的連通部分
   //引數說明:輸入的圖片(RegionDynThresh)
   //            得到的連通區域(ConnectedRegions)
   select_shape (ConnectedRegions,SelectedRegions,’area’,’and’,4,99999)//根據指定的形態特徵選擇區域
   //引數說明:輸入的圖片(ConnectedRegions)
   //            滿足條件的區域(SelectedRegions)
   //            將要計算的形態特徵(’area’)
   //            獨立特徵間的連線關係(’and’)
   //            特徵的最小限制(4)
   //            特徵的最大限制(99999)
   union1(SelectedRegions,RegionUnion)    //返回包含所有區域的集合
   //引數說明:包含所有區域的待計算區域的圖片(tedRegions)
   //            所有輸入區域合(RegionUnion)
   closeing_circle(RegionUnion,RegionClosing,10)//用一個圓圈來封閉一個區域
   //引數說明:將要被封閉的區域(RegionUnion)
   //            被封閉的區域(RegionClosing)
   //            圓圈的半徑(10)
   connection(RegionClosing,ConnectedRegions1)
   select_shape(ConnectedRegions1,SelectedRegions1,’area’,’and’,10,99999)
   area_center(SelectedRegions1,Area,Row,Column)    //計算區域的面積以及中心位置
   //引數說明:待計算的區域(SelectedRegions1)
   //            區域的面積(Area)
   //            區域中心的行(Row)
   //            區域中心的列(Column)
   *
   *Display the results
   dev_display(Image)        //顯示原圖
   Number := |Area|          //將區域面積賦給Number用於後面檢查是否存在缺陷
   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)//構造一個與設定的圓弧或圓相一致的邊界
       //引數說明:生成的邊界(ContCircle)
       //            圓弧或圓的中心座標(Row,Cloumn)
       //            圓弧或圓的半徑(gen_tuple_const(Number,30))
       //            圓弧或圓的起始角度(gen_tuple_const(Number,0))
       //            圓弧或圓的結束角度(gen_tuple_const(Number,rad(360)))
       //            不明白是什麼意思
       //            相鄰兩點間的距離(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,’ture’)
      if(Index#NumImages)
            disp_continue_message(WindowHandle,’black’,’ture’)
            stop()
      endif
endfor

演算法講解:在實際的表面缺陷檢測系統中,針對的檢測表面很多是具有一定紋理的比如:布匹、皮革、塑料等,針對這一類表面的檢測就不能單純依靠幀差或者背景差來完成,因為背景的紋理不可能和當前影象的紋理完全相同。因此,本例程的演算法通過將影象變換到頻域進行處理,提取缺陷分量後反變換到時域,獲得缺陷的具體位置。

高斯濾波器:在本演算法中,在一開始就構造了兩個高斯濾波器,高斯濾波器是一種線性平滑濾波器,適用於消除高斯噪聲。濾波器的實質是對訊號進行濾波,濾除不需要的部分,得到想要的部分。一個低通的濾波器可以濾除高頻訊號,對於影象來說,噪聲和邊緣往往集中在高頻分量,因此低通能夠降噪,但是也能造成影象的模糊。

本文關鍵

:本文的關鍵就是使用兩個低通濾波器,進行相減後構造了一個帶阻濾波器來提取缺陷分量。這就需要保證在實際的待檢測表面中缺陷所處的頻率範圍要和背景以及噪聲有明顯的差異,並且帶阻的頻率選擇要合適。通過帶阻濾波後獲得的頻率成分對背景中的紋理要有明顯的抑制,並且突出缺陷成分,進行傅立葉反變換後重構的影象就是缺陷影象,經過簡單的分割就能很容易得到缺陷了。


相關推薦

Halcon學習筆記缺陷檢測布匹皮革塑料

例程:detect_indent_fft.hdev說明:這個程式展示瞭如何利用快速傅立葉變換(FFT)對塑料製品的表面進行目標(缺陷)的檢測,大致分為三步:首先,我們用高斯濾波器構造一個合適的濾波器(將原圖通過高斯濾波器濾波);然後,將原圖和構造的濾波器進行快速傅立葉變換;最

Halcon學習筆記缺陷檢測(一)

*surface_scratch.hdev:extraction of surface scratches via local thresholding and morphological post-processing* dev_close_window() dev_update_window(‘of

設計模式C++學習筆記十一c/c++面試筆試題

一、指標與引用有什麼區別? 1、指標會佔用記憶體,引用不佔用記憶體。 2、引用在定義時必須初始化。 3、沒有空的引用,但是有空的指標。 二、static關鍵的幾個作用 1、函式體內的static變數的作用範圍為該函式體,該變數記憶體只分配一次,因此其值在下次再呼叫該函式時

學習筆記——前景檢測演算法未完待續

    這段時間,本人主要對視訊前景提取演算法進行了學習,在此寫下學習筆記~希望與各位看客多交流學習(本學習筆記部分來自我的三位師弟的調研報告~由於保密隱私,不在此公開,但是非常感謝三位師弟~),好下面進入正題 前景是影象或視訊場景中可見性、顯著性更強的部分。前

JavaSE 學習筆記接 口

之前 rac 關鍵字 extends 修飾符 對象 clas con 而且 接 口: 1:是用關鍵字interface定義的。 2:接口中包含的成員,最常見的有全局常量、抽象方法。 註意:接口中的成員都有固定的修飾符。 成員變量:public static fina

JavaSE 學習筆記多態

會有 轉換 容易 per 不同 如何 person 特點 一句話 多 態:函數本身就具備多態性,某一種事物有不同的具體的體現。 體現:父類引用或者接口的引用指向了自己的子類對象。//Animal a = new Cat(); 多態的好處:提高了程序的擴展性。 多態的弊端

JavaSE 學習筆記Java概述

environ 電子 6.0 run javase 有一點 架構 spa form 一、Java的三種技術架構: JAVAEE:Java Platform Enterprise Edition,開發企業環境下的應用程序,主要針對web程序開發; JAVASE:Java P

matlab學習筆記常用命令

plot 我們 all 查看 學習 ear tla clear 但是 一.清除命令。   1.clear all;%清除所有變量,通常在matlab的工作區;另外斷點也會被清除掉   2.close all;%關閉所有窗口(除了編輯器窗口、命令窗口、幫助窗口)   3.cl

java學習筆記基礎語法

讓其 實例 高效率 使用 個數 存儲 記錄 棧內存 數組 1.數組: 概念:同一種類型數據的集合,其實,數組就是一個容器 優點:可以方便的對其進行操作,編號從0開始,方便操作這些元素。 2,數組的格式 元素類型[]數組名=new 元素類型[數組元素個

linux學習筆記shell程式設計

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則

linux學習筆記流程控制if分支語句

流程控制 if語句 單分支if語句 程式 fi``` ```if [ 判斷 ] then 程式 fi``` 例項程式碼指令碼: #!/bin/bash

linux學習筆記shell程式設計流程控制3---for迴圈

for迴圈 語法格式1:指定迴圈範圍 for 變數 in value1 value2... do something done 指令碼例項1 #!/bin/bash for i in 1 2

linux學習筆記shell程式設計流程控制4while迴圈和until迴圈

while迴圈和until迴圈 ###、 while迴圈 不定迴圈,程式碼格式: while [判斷] do something done 指令碼例項1: #!/bin/bash #從1加到

python學習筆記基礎操作字串格式化1%格式化

格式化基本格式 s = "i am %s ,i am %d years old ,and i like %s"%("haiyang",20,"zhu") print(s) #區分資料型別,無法自動在字串

python學習筆記基礎操作字串格式化2format

format格式化 1,基本格式 #對於每一個大括號,在後面的引數中找到對應的引數插進來 #format操作類似於於將傳入的引數製成多個數據的資料結構元組或者字典,然後依照索引插入引數 s = "i a

學習筆記計算機網路王道考研 第六章 應用層

在C/S模型中,伺服器總是處於開啟狀態(除非某人把它關了) 常見的使用C/S模型的英應用包括Web、檔案傳輸(FTP)、遠端登入和電子郵件等  C/S模型的主要特點: 網路中各計算機的地位不平等,伺服器可以通過對使用者許可權的限制來達到管理客戶機的目的

學習筆記計算機網路王道考研 第五章 傳輸層

傳輸層屬於面向通訊的最高層,同時也是使用者功能中的最低層 傳輸層提供應用程序之間的邏輯通訊(即端到端的通訊),與網路層的區別是,網路層提供的是主機之間的邏輯通訊 傳輸層的複用和分用:複用是指傳送方不同的應用程序都可以使用同一個傳輸層協議傳送資料;分用是指接收方的傳輸層在剝去報文的首

學習筆記計算機網路王道考研 第四章 網路層

網路層的功能: 異構網路互聯 路由與轉發。路由表的兩大功能:路由選擇和分組轉發 擁塞控制 判斷網路是否進入擁塞狀態的方法是觀察網路的吞吐量與網路的負載的關係:如果隨著網路負載的增加,網路的吞吐量明顯小於正常的吞吐量,那麼網路就可能進入了“輕度擁塞狀態”;

學習筆記計算機網路王道考研 第三章 資料鏈路層

資料鏈路層的功能: 為網路層提供服務 鏈路管理 幀定界、幀同步和透明傳輸 流量控制 差錯控制 資料鏈路層可以為網路層提供的服務有: 無確認的無連線服務 有確認的無連線服務 有確認的面向連線服務(有連線則一定有確認)

學習筆記計算機網路王道考研 第二章 物理層

模擬資料(模擬訊號)和離散資料(離散訊號) 序列傳輸和並行傳輸 基帶訊號:將數字訊號1和0直接用兩種不同的電壓表示,然後傳送到數字通道上去傳輸(稱為基帶傳輸) 寬頻訊號:將基帶訊號進行調製後形成的頻分複用模擬訊號,然後傳送到模擬通道上去傳輸(稱為寬頻傳輸) 單工通訊(僅