Halcon学习之缺陷检测-凸点检测
生活随笔
收集整理的這篇文章主要介紹了
Halcon学习之缺陷检测-凸点检测
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
思路:讀取圖片--》圖片轉(zhuǎn)化為灰度---》快速傅里葉變換把圖像轉(zhuǎn)到頻域---》頻域?yàn)V波器進(jìn)行卷積---》快速傅里葉反變換---》用一個(gè)矩形掩膜計(jì)算像素點(diǎn)的灰度范圍---》求圖片灰度值的最大和最小值和變換范圍---》利用全局閾值對圖像進(jìn)行分割---》連通區(qū)域---》根據(jù)面積篩選區(qū)域---》合并區(qū)域---》使用圓形元素對區(qū)域進(jìn)行閉運(yùn)算---》連通區(qū)域---》根據(jù)面積篩選區(qū)域---》計(jì)算區(qū)域的面積以及中心位置---》顯示結(jié)果
例程:detect_indent_fft.hdev
說明:這個(gè)程序展示了如何利用快速傅里葉變換(FFT)對塑料制品的表面進(jìn)行目標(biāo)(缺陷)的檢測,大致分為三步:
首先,我們用高斯濾波器構(gòu)造一個(gè)合適的濾波器(將原圖通過高斯濾波器濾波);
然后,將原圖和構(gòu)造的濾波器進(jìn)行快速傅里葉變換;
最后,利用形態(tài)學(xué)算子將缺陷表示在濾波后的圖片上(在缺陷上畫圈)。
注:代碼中綠色部分為個(gè)人理解和注釋,其余為例程中原有代碼
*Initialization(初始化) dev_updata_off() //這一句包含如下三個(gè)算子: //dev_updata_pc(‘off’) 關(guān)閉更新程序計(jì)數(shù)器 //dev_updata_var(‘off’) 關(guān)閉更新變量窗口 //dev_updata_window(‘off’) 關(guān)閉更新圖像窗口(即通過命令來顯示想要在圖像窗口顯示的圖片) dev_close_window() //關(guān)閉活動的圖像窗口 read_image(Image,’plastics / plastics_01’) //載入圖片 //參數(shù)說明:為讀入圖片命名(Image) // 文件名(’plastics/plastics_01’) get_image_size(Image,Width,height) //獲取圖片的長寬; //參數(shù)說明:之前讀入或生成的圖片(Image) // 圖片的寬(Width) // 圖片的高(Height) dev_open_window(0,0,Width,Height,’Black’,WindowHandle) //打開一個(gè)新的圖像窗口 //參數(shù)說明:起始坐標(biāo)(0,0) // 大小(Width,Height) // 背景顏色(’Black’) // 窗口句柄(WindowHandle) set_display_font (WindowHandle,14,’mono’,’ture’,’false’)//設(shè)置不依賴操作系統(tǒng)的字體 //參數(shù)說明:窗口句柄(WindowHandle) // 字體大小(14) // 字體類型(’mono’) // 是否黑體(’ture’) // 是否傾斜(’false’) dev_set_draw(‘Margin’) //定義區(qū)域填充模式 //參數(shù)說明:填充模式(’Margin’或者’Fill’)dev_set_line_width(3) //設(shè)置輸出區(qū)域輪廓線的線寬//可以修改參數(shù)來看最后缺陷區(qū)域標(biāo)示的區(qū)別 dev_set_color(’red’) //設(shè)置一種或者多種輸出顏色* *Optimize the fft speed for the specific image size(根據(jù)指定圖像大小進(jìn)行fft速度最優(yōu)化) optimize_rft_speed(Width,Height,’standard’) //對指定大小的圖片的fft速度進(jìn)行優(yōu)化 //參數(shù)說明:圖片大小(Width,Height) // 優(yōu)化模式(’standard’)* *Construct a suitable filter by combining two Gaussian filters(結(jié)合兩個(gè)高斯濾波器構(gòu)造一*個(gè)合適的濾波器) Sigma1 := 10.0 Sigma2 := 3.0 //定義兩個(gè)常量 gen_gauss_filter(GaussFilter1,Sigma1,Sigma1,0.0,’none’,’rft’,Width,Height) gen_gauss_filter(GaussFilter2,Sigma2,Sigma2,0.0,’none’,’rft’,Width,Height) //在頻域生成兩個(gè)高斯濾波器 //參數(shù)說明:生成的高斯濾波器(GaussFilter) // 空域中高斯在主方向上的標(biāo)準(zhǔn)差(Sigma) // 空域中高斯在正交于主方向的方向上的標(biāo)準(zhǔn)差(Sigma) // 濾波器主方向的角度(0.0) // 濾波器的規(guī)范(’none’) // 直流項(xiàng)在頻域的位置(’rft’) // 圖片的大小(Width,Height) sub_image(GaussFilter1,GaussFilter2,Filter,1,0) //兩圖片相減(灰度) //sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : ) //g' := (g1 - g2) * Mult + Add //以上為函數(shù)原型以及運(yùn)算公式* *Process the images iteratively(對圖像進(jìn)行迭代運(yùn)算) NumImages := 11 For Index := 1 to NumImages by 1 //for循環(huán)從1到NumImages,步長為1**Read an image and convert it to gray valuesread_image(Image,’plastics/plastics_’+Index$’02’)rgb1_to_gray(Image,Image) //將原圖轉(zhuǎn)化為灰度圖,第一個(gè)參數(shù)為原圖*Perform the convolution in the frequency domainrft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)//對計(jì)算一幅圖片實(shí)部進(jìn)行快速傅里葉變換//參數(shù)說明:輸入的圖片(Image)// 傅里葉變換后輸出的圖片(ImageFFT)// 變換方向(’to_freq’或’from_freq’)// 變換因子的規(guī)范(’none’)// 輸出圖片的數(shù)據(jù)類型(’complex’)// 圖片的寬(Width)convol_fft(ImageFFT,Filter,ImageConvol) //對圖片用一個(gè)濾波器在頻域進(jìn)行卷積運(yùn)算//參數(shù)說明:輸入的圖片(ImageFFT)// 頻域?yàn)V波器(Filter)// 運(yùn)算后輸出的結(jié)果rft_generic(ImageConvol,ImageFiltered,’from_freq’,’n’,’real’,Width) //對濾波后的圖片進(jìn)行傅里葉反變換**Process the filtered imagegray_range_rect(ImageFiltered,ImageResult,10,10)//用一個(gè)矩形掩膜計(jì)算像素點(diǎn)的灰度范圍//參數(shù)說明:輸入的圖片(ImageFiltered)// 輸出的灰度范圍圖(ImageResult)// 矩形掩膜大小(10,10)min_max_rect(ImageResult,ImageResult,0,Min,Max,Range)//判斷區(qū)域內(nèi)灰度值的最大和最小值//參數(shù)說明:待分析圖片區(qū)域(ImageResult)// 圖片(ImageResult)// 被去除的直方圖兩邊像素點(diǎn)所// 占總像素?cái)?shù)的百分比(0)// 得到的最小值最大值及灰度值范圍(Min,Max,Range)threshold(ImageResult,RegionDynThresh,max([5.55,Max*0.8]),255)//利用全局閾值對圖像進(jìn)行分割//參數(shù)說明:輸入的圖片(ImageResult)// 分割后得到的區(qū)域(RegionDynThresh)// 閾值(max([5.55,Max*0.8]),255)// 公式:MinGray <= g <= MaxGrayconnection(RegionDynThresh,ConnectedRegions) //計(jì)算區(qū)域內(nèi)的連通部分//參數(shù)說明:輸入的圖片(RegionDynThresh)// 得到的連通區(qū)域(ConnectedRegions)select_shape (ConnectedRegions,SelectedRegions,’area’,’and’,4,99999)//根據(jù)指定的形態(tài)特征選擇區(qū)域//參數(shù)說明:輸入的圖片(ConnectedRegions)// 滿足條件的區(qū)域(SelectedRegions)// 將要計(jì)算的形態(tài)特征(’area’)// 獨(dú)立特征間的連接關(guān)系(’and’)// 特征的最小限制(4)// 特征的最大限制(99999)union1(SelectedRegions,RegionUnion) //返回包含所有區(qū)域的集合//參數(shù)說明:包含所有區(qū)域的待計(jì)算區(qū)域的圖片(tedRegions)// 所有輸入?yún)^(qū)域合(RegionUnion)closeing_circle(RegionUnion,RegionClosing,10)//用一個(gè)圓圈來封閉一個(gè)區(qū)域//參數(shù)說明:將要被封閉的區(qū)域(RegionUnion)// 被封閉的區(qū)域(RegionClosing)// 圓圈的半徑(10)connection(RegionClosing,ConnectedRegions1)select_shape(ConnectedRegions1,SelectedRegions1,’area’,’and’,10,99999)area_center(SelectedRegions1,Area,Row,Column) //計(jì)算區(qū)域的面積以及中心位置//參數(shù)說明:待計(jì)算的區(qū)域(SelectedRegions1)// 區(qū)域的面積(Area)// 區(qū)域中心的行(Row)// 區(qū)域中心的列(Column)**Display the resultsdev_display(Image) //顯示原圖Number := |Area| //將區(qū)域面積賦給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)//構(gòu)造一個(gè)與設(shè)定的圓弧或圓相一致的邊界//參數(shù)說明:生成的邊界(ContCircle)// 圓弧或圓的中心坐標(biāo)(Row,Cloumn)// 圓弧或圓的半徑(gen_tuple_const(Number,30))// 圓弧或圓的起始角度(gen_tuple_const(Number,0))// 圓弧或圓的結(jié)束角度(gen_tuple_const(Number,rad(360)))// 不明白是什么意思// 相鄰兩點(diǎn)間的距離(1)ResultMessage := [‘Not OK’,Number + ‘defect(s) found’]Color := [‘red’,’black’]dev_display(ContCircle)elseResultMessage := ‘OK’Color := ‘forest green’endifdisp_message(WindowHandle,ResultMessage,’window’,12,12,Color,’ture’)if(Index#NumImages)disp_continue_message(WindowHandle,’black’,’ture’)stop()endif endfor總結(jié)
以上是生活随笔為你收集整理的Halcon学习之缺陷检测-凸点检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 房地产开发建设项目管理(全程房地产典范企
- 下一篇: 耦合概念