Halcon 表面檢測 裂紋檢測

2021-09-25 04:49:07 字數 3616 閱讀 3555

對應示例程式:

detect_mura_defects_blur.hdev

目標:例項實現lcd上有很多汙點干擾下,檢測lcd的印痕檢測。

思路為:對lcd影象進行拆分,提取rgb三個分量。

對b分量進行處理,將其轉換為頻域內影象,並對其進行高斯卷積。

再將卷積處理後的影象轉換回空間域影象。

隨後將b分量影象和處理後的b分量影象用運算元sub_image做差運算。

最後就可以呼叫lines_gauss提取印痕了。

為避免邊框對lines_gauss的影響,對影象進行了一定的擷取處理,

用erosion_rectangle1將四周去除了。

影象:

**:

* 實現帶汙點lcd印痕檢測

dev_close_window ()

dev_update_off ()

path := 'lcd/mura_defects_blur_'

read_image (image, path + '01')

get_image_size (image, width, height)

dev_open_window_fit_size (0, 0, width, height, 640, 480, windowhandle)

set_display_font (windowhandle, 14, 'mono', 'true', 'false')

dev_set_draw ('margin')

dev_set_line_width (3)

dev_set_color ('red')

scalefactor := 0.4

calculate_lines_gauss_parameters (17, [25,3], sigma, low, high)

for f := 1 to 3 by 1

read_image (image, path + f.2i')

*將三通道彩色 影象進行拆分為r,g,b

decompose3 (image, r, g, b)

* 計算影象b的快速傅利葉變換,也就是頻域變換,imagefft為輸出結果影象,to_freq表示從空間到頻域變換。

*none表示變換的規範變化因數,complex表示輸出影象為complex型別,width為影象寬度。

rft_generic (b, imagefft, 'to_freq', 'none', 'complex', width)

*生成高斯濾波器imagegauss,100為在空間域中高斯 在主方向生成的標準差,

*另100為空間域 中高斯在正交於主方向 上的標準差,0表示 濾波器主方向 上的角度 ,none為濾波器的規範。

*rft為直流 項在頻域 的位置,最後 兩引數為你寬高。

gen_gauss_filter (imagegauss, 100, 100, 0, 'n', 'rft', width, height)

*在頻域imagefft上,用高斯濾波器imagegauss做卷積。

convol_fft (imagefft, imagegauss, imageconvol)

*與上乙個rft_generic做反向運算,將頻域影象轉換為空間域的影象。

rft_generic (imageconvol, imagefft1, 'from_freq', 'none', 'byte', width)

*將兩幅影象做減法運算,公式為g' := (g1 - g2) * mult + add。

*g1,g2表示b, imagefft1的灰度值,g表示計算結果圖imagesub,2為mult,100為add。

sub_image (b, imagefft1, imagesub, 2, 100)

* 將影象imagesub進行放大觀察,imagezoomed為放大後的影象,scalefactor, scalefactor為長寬放大加數,

*constant為插值方法。

zoom_image_factor (imagesub, imagezoomed, scalefactor, scalefactor, 'constant')

* 獲取一幅圖的區域,目的為避免邊框對lines_gauss的影響。

get_domain (imagezoomed, domain)

*對影象 進行腐蝕運算處理,7,7為矩形 結構寬高。

erosion_rectangle1 (domain, regionerosion, 7, 7)

*在影象imagezoomed擷取regionerosion大小,存放到變數imagereduced

reduce_domain (imagezoomed, regionerosion, imagereduced)

*檢測影象的線條與寬度。imagereduced, lines為輸入影象與輸出的亞畫素線條,

*sigma為高斯平滑係數, low為後滯閾值分隔低值, high為前置閾值分割高值,

*'dark'表示 提取影象 中的暗線條, 'true'表示 是否提取線條 寬度, 'gaussian'提取線條的模式,

lines_gauss (imagereduced, lines, sigma, low, high, 'dark', 'true', 'gaussian', 'true')

*生成齊次轉換矩陣

hom_mat2d_identity (hommat2didentity)

*新增縮放的齊次轉換矩陣,hommat2didentity為輸入矩陣,

*1 / scalefactor, 1 / scalefactor為縮放因數, hommat2dscale為輸出的矩陣。

hom_mat2d_scale_local (hommat2didentity, 1 / scalefactor, 1 / scalefactor, hommat2dscale)

*對亞畫素直線lines進行仿射變換。

affine_trans_contour_xld (lines, defects, hommat2dscale)

* dev_display (image)

dev_display (defects)

if (f < 3)

disp_continue_message (windowhandle, 'black', 'true')

stop ()

endif

endfor

複製**

用到的幾個運算元:

calculate_lines_gauss_parameters

根據要提前線條的最大寬度和對比度,為運算元line_gauss計算出引數sigma、low和high。

rft_generic

傅利葉變換 空間域–頻率域的轉換

gen_gauss_filter

生成高斯濾波器

convol_fft

卷積lines_gauss

從影象中提取線。引數lightdark設定提取亮線還是暗線。

仿射變換

hom_mat2d_identity

hom_mat2d_scale_local

affine_trans_contour_xld

參考資料:

[1]:

Halcon表面缺陷檢測 不均勻光照的表面缺陷

對應示例程式 find scratches bandpass fft.hdev 目標 實現不均勻光照的表面缺陷。思路為 先建立乙個合適的帶通濾波器,然後把影象 例程做了影象反轉 傅利葉變換在頻域濾波,加強高頻部分,然後變回時域做形態學處理,最後通過line gauss檢測出缺陷。影象 dev upd...

opencv表面缺陷檢測 視覺檢測 表面缺陷檢測

當今社會,隨著計算機技術,人工智慧等科學技術的出現和發展,以及研究的深入,出現了基於機器視覺技術的表面缺陷檢測技術。這種技術的出現,大大提高了生產作業的效率,避免了因作業條件,主觀判斷等影響檢測結果的準確性,實現能更好更精確地進行表面缺陷檢測,更加快速的識別產品表面瑕疵缺陷。產品表面缺陷檢測屬於機器...

Halcon 餅乾缺陷檢測

使用的主要是blob 特徵的方式 blob用於定位 特徵 這裡主要使用的是區域所佔的面積數 和矩形度兩個指標。因為面積數是個經驗值,所以上面有些ng和ok是很接近的。讀取read image image,food hazelnut wafer 01 關閉視窗 dev close window 開啟乙...