對應示例程式:
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 開啟乙...