影像分析,使用Halcon進行缺陷檢測
1.首先簡單介紹一下Halcon開發:
HALCON是德國MVtec公司開發的一套完善的標準的機器視覺演算法包,擁有應用廣泛的機器視覺整合開發環境。它節約了產品成本,縮短了軟體開發週期——HALCON靈活的架構便於機器視覺,醫學影像和影像分析應用的快速開發。在歐洲以及日本的工業界已經是公認具有最佳效能的Machine Vision軟體。
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
執行效果圖:
相關文章
- halcon缺陷檢測
- Halcon表面缺陷檢測-劃痕檢測
- Halcon缺陷檢測例項轉OpenCV實現(二) PCB印刷缺陷檢測OpenCV
- Halcon表面缺陷檢測-光度立體法
- Halcon缺陷檢測例項轉OpenCV實現(三) 物體凸缺陷檢測OpenCV
- Halcon表面缺陷檢測-光度立體法檢測藥片包裝背面的缺陷
- halcon——缺陷檢測常用方法總結(測量擬合)
- halcon——缺陷檢測常用方法總結(特徵訓練)特徵
- halcon——缺陷檢測常用方法總結(光度立體)
- halcon視覺缺陷檢測系列(1)常用的6種方法視覺
- halcon——缺陷檢測常用方法總結(模板匹配(定位)+差分)
- halcon——缺陷檢測常用方法總結(頻域空間域結合)
- 網格缺陷檢測(二值化閾值分析)
- 教程:使用Python進行基本影像資料分析!Python
- halcon 修改影像格式
- 物體檢測實戰:使用 OpenCV 進行 YOLO 物件檢測OpenCVYOLO物件
- halcon三維檢測啟蒙1
- 在C#中使用Halcon開發視覺檢測程式C#視覺
- 使用 Rust 和 OpenCV 進行物體檢測RustOpenCV
- 使用 YOLO 進行實時目標檢測YOLO
- 道路缺陷智慧檢測系統
- 使用 Vyper 實現影像邊緣檢測
- 使用 Vala 實現影像邊緣檢測
- 使用 Fantom 實現影像邊緣檢測
- 使用關鍵點進行小目標檢測
- 檢測-紋理表面凸起、凹痕、劃痕缺陷的檢測
- Halcon影像和檔案操作
- 布匹缺陷檢測baseline提升過程
- 深度學習之瑕疵缺陷檢測深度學習
- 使用 Go 語言與 OpenCV 進行物體檢測GoOpenCV
- 影像邊緣檢測
- halcon的頻域影像處理
- Halcon採集影像Image Acquisition解析UI
- Python OpenCV 3 使用背景減除進行目標檢測PythonOpenCV
- 使用VLD進行記憶體洩漏檢測(release + debug)記憶體
- 使用 Nim 進行基礎影像識別
- 使用 Racket 進行基礎影像識別Racket
- 使用 OCaml 進行基礎影像識別