日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

傅里叶变换进行缺陷检测detect_indent_fft.hdev(源代码与详细解析)

發(fā)布時(shí)間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 傅里叶变换进行缺陷检测detect_indent_fft.hdev(源代码与详细解析) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 簡(jiǎn)介
    • 程序解析
    • 處理結(jié)果預(yù)覽
    • 算法講解

簡(jiǎn)介

detect_indent_fft.hdev是halcon的示例程序,是傅里葉變換進(jìn)行缺陷檢測(cè)的一個(gè)例子,主要是傅里葉變換在復(fù)雜背景下的缺陷檢測(cè)

這個(gè)程序展示了如何利用快速傅里葉變換(FFT)對(duì)塑料制品的表面進(jìn)行缺陷檢測(cè),大致分為三步:

1、用高斯濾波器構(gòu)造一個(gè)合適的濾波器(將原圖通過(guò)高斯濾波器濾波);

2、將原圖和構(gòu)造的濾波器進(jìn)行快速傅里葉變換;

3、利用形態(tài)學(xué)進(jìn)行缺陷檢測(cè)。

程序解析

關(guān)于顯示類函數(shù)解釋https://blog.csdn.net/cashmood/article/details/93999690
dev_updata_off()

dev_close_window() //關(guān)閉活動(dòng)的圖像窗口
讀入圖片
read_image(Image,’plastics/plastics_01’)
獲取圖片的長(zhǎng)寬
//參數(shù)說(shuō)明:讀入的圖片(Image); 圖片的寬(Width);圖片的高(Height)
get_image_size(Image,Width,height)

dev_open_window(0,0,Width,Height,’Black’,WindowHandle)
設(shè)置顯示字體
set_display_font (WindowHandle,14,’mono’,’ture’,’false’)

dev_set_draw(‘Margin’)

dev_set_line_width(3)

dev_set_color(’red’)

(根據(jù)圖像大小進(jìn)行fft速度最優(yōu)化)
對(duì)指定大小的圖片的fft速度進(jìn)行優(yōu)化
//參數(shù)說(shuō)明:圖片大小(Width,Height);優(yōu)化模式(’standard’);
optimize_rft_speed(Width,Height,’standard’)

(結(jié)合兩個(gè)高斯濾波器構(gòu)造一個(gè)合適的濾波器)

定義兩個(gè)常量
Sigma1 := 10.0 Sigma2 := 3.0

在頻域生成兩個(gè)高斯濾波器
//參數(shù)說(shuō)明:生成的高斯濾波器(GaussFilter); 空域中高斯在主方向上的標(biāo)準(zhǔn)差(Sigma); 空域中高斯在正交于主方向的方向上的標(biāo)準(zhǔn)差(Sigma);濾波器主方向的角度(0.0); 濾波器的規(guī)范(’none’);直流項(xiàng)在頻域的位置(’rft’);圖片的大小(Width,Height)
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ù)原型以及運(yùn)算公式: sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
//g’ := (g1 - g2) * Mult + Add

sub_image(GaussFilter1,GaussFilter2,Filter,1,0) //兩圖片相減(灰度)

(開始進(jìn)行圖像檢測(cè))
NumImages := 11
for循環(huán)從1到NumImages,步長(zhǎng)為1
for Index := 1 to NumImages by 1

read_image(Image,’plastics/plastics_’+Index$’02’)

將圖片轉(zhuǎn)化為灰度圖,第一個(gè)參數(shù)為原圖
rgb1_to_gray(Image,Image)

*Perform the convolution in the frequency domain
對(duì)一幅圖片進(jìn)行快速傅里葉變換
//參數(shù)說(shuō)明:輸入的圖片(Image);傅里葉變換后輸出的圖片(ImageFFT);變換方向(’to_freq’或’from_freq’);變換因子的規(guī)范(’none’);輸出圖片的數(shù)據(jù)類型(’complex’);圖片的寬(Width)
rft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)

圖片用一個(gè)濾波器在頻域進(jìn)行卷積運(yùn)算
//參數(shù)說(shuō)明:輸入的圖片(ImageFFT);頻域?yàn)V波器(Filter);運(yùn)算后輸出的結(jié)果
convol_fft(ImageFFT,Filter,ImageConvol) //對(duì)圖片用一個(gè)濾波器在頻域進(jìn)行卷積運(yùn)算

對(duì)濾波后的圖片進(jìn)行快速傅里葉反變換
rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width)

用一個(gè)矩形掩膜計(jì)算像素點(diǎn)的灰度范圍
//參數(shù)說(shuō)明:輸入的圖片(ImageFiltered); 輸出的灰度范圍圖(ImageResult);矩形掩膜大小(10,10)
灰度范圍計(jì)算方法:矩形掩膜內(nèi)的最大灰度值-最小灰度值

gray_range_rect(ImageFiltered,ImageResult,10,10)

求圖片灰度值的最大和最小值和變換范圍
//參數(shù)說(shuō)明:待分析圖片區(qū)域(ImageResult); 圖片(ImageResult);被去除的直方圖兩邊像素點(diǎn)所;占總像素?cái)?shù)的百分比(0);得到的最小值最大值及灰度值范圍(Min,Max,Range)
min_max_rect(ImageResult,ImageResult,0,Min,Max,Range)//判斷區(qū)域內(nèi)灰度值的最大和最小值

利用全局閾值對(duì)圖像進(jìn)行分割
//參數(shù)說(shuō)明:輸入的圖片(ImageResult);分割后得到的區(qū)域(RegionDynThresh);閾值(max([5.55,Max0.8]),255);公式:MinGray <= g <= MaxGray
threshold(ImageResult,RegionDynThresh,max([5.55,Max0.8]),255)//

分割連通域
//參數(shù)說(shuō)明:輸入的區(qū)域(RegionDynThresh);分割連通域后的區(qū)域(ConnectedRegions)
connection(RegionDynThresh,ConnectedRegions)

根據(jù)面積篩選區(qū)域
select_shape (ConnectedRegions,SelectedRegions,’area’,’and’,4,99999)

合并區(qū)域
union1(SelectedRegions,RegionUnion)

使用圓形元素對(duì)區(qū)域進(jìn)行閉運(yùn)算
closeing_circle(RegionUnion,RegionClosing,10)

分割連通域
connection(RegionClosing,ConnectedRegions1)

根據(jù)面積篩選區(qū)域
select_shape(ConnectedRegions1,SelectedRegions1,’area’,’and’,10,99999)

計(jì)算區(qū)域的面積以及中心位置
area_center(SelectedRegions1,Area,Row,Column)

顯示結(jié)果

dev_display(Image)

定義一個(gè)變量統(tǒng)計(jì)區(qū)域的個(gè)數(shù)
//參數(shù)說(shuō)明:在halcon中“||”代表求數(shù)組內(nèi)元素的個(gè)數(shù)
Number := |Area|

判斷是否存在缺陷區(qū)域
if(Number)

如果存在缺陷區(qū)域,畫出缺陷區(qū)域

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’

如果不存在缺陷區(qū)域,顯示OK
endif

disp_message(WindowHandle,ResultMessage,’window’,12,12,Color,’ture’) if(Index#NumImages)disp_continue_message(WindowHandle,’black’,’ture’)stop()endif

endfor

處理結(jié)果預(yù)覽








算法講解

在實(shí)際的表面缺陷檢測(cè)系統(tǒng)中,針對(duì)的檢測(cè)表面很多是具有一定紋理的比如:布匹、皮革、塑料等,針對(duì)這一類表面的檢測(cè)就不能單純依靠幀差或者背景差來(lái)完成,因?yàn)楸尘暗募y理不可能和當(dāng)前圖像的紋理完全相同。因此,本例程的算法通過(guò)將圖像變換到頻域進(jìn)行處理,提取缺陷分量后反變換到時(shí)域,獲得缺陷的具體位置。
在本算法中,在一開始就構(gòu)造了兩個(gè)高斯濾波器,高斯濾波器是一種線性平滑濾波器,適用于消除高斯噪聲。濾波器的實(shí)質(zhì)是對(duì)信號(hào)進(jìn)行濾波,濾除不需要的部分,得到想要的部分。一個(gè)低通的濾波器可以濾除高頻信號(hào),對(duì)于圖像來(lái)說(shuō),噪聲和邊緣往往集中在高頻分量,因此低通能夠降噪,但是也能造成圖像的模糊。
關(guān)鍵就是使用兩個(gè)低通濾波器,進(jìn)行相減后構(gòu)造了一個(gè)帶阻濾波器來(lái)提取缺陷分量。這就需要保證在實(shí)際的待檢測(cè)表面中缺陷所處的頻率范圍要和背景以及噪聲有明顯的差異,并且?guī)ё璧念l率選擇要合適。通過(guò)帶阻濾波后獲得的頻率成分對(duì)背景中的紋理要有明顯的抑制,并且突出缺陷成分,進(jìn)行傅里葉反變換后重構(gòu)的圖像就是缺陷圖像,經(jīng)過(guò)簡(jiǎn)單的分割就能很容易得到缺陷了。

總結(jié)

以上是生活随笔為你收集整理的傅里叶变换进行缺陷检测detect_indent_fft.hdev(源代码与详细解析)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。