**简述:**检测塑料产品的缺陷,一般为凹痕等缺陷。这个程序演示了如何使用快速傅里叶变换(FFT)检测塑料物体表面的小纹理缺陷。
步骤与一些名词方法概念
**1.**首先,我们用高斯滤波器构造一个合适的滤波器。
具体操作步骤:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的灰度值。
高斯滤波:是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。
滤波器:一个将图像信号进行能量转化的数学模型,噪声就是属于信号的高频率部分。
高斯滤波器:对图像信号进行平滑处理(尤其适用于正态分布噪音处理),防止噪音误差累积。
**2.**然后,利用快速傅里叶变换对图像和滤波器进行卷积。
FFT是离散傅里叶变换的快速算法,可以将一个信号变换到频域。
傅里叶变换:将时域信号以不同频率的正弦和或余弦之和表示。
卷积:模板匹配扫描图像中的每一个像素,平滑处理。
**3.**最后,利用形态学算子在滤波后的图像中检测缺陷。
形态学算子:主要思想是用一定形状的结构元素在图像中抽取出相应的某些结构,通常可以用于图像的滤波、分割、分类等处理。形态学算子有腐蚀、膨胀、开和闭四种。
算子特点本文的关键就是使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量。
对背景中的纹理要有明显的抑制,并且突出缺陷成分,进行傅里叶反变换后重构的图像就是缺陷图像,经过简单的分割就能很容易得到缺陷了。
* 第一步,初始化设置
dev_update_off ()
*这一句包含如下三个算子:*dev_updata_pc(‘off’)关闭更新程序计数器
*dev_updata_var(‘off’)关闭更新变量窗口
*dev_updata_window(‘off’) 关闭更新图像窗口
dev_close_window ()
*关闭活动的图像窗口
read_image (Image, 'plastics/plastics_01')
*参数说明:为读入图片命名(Image)文件名(’plastics/plastics_01’)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*打开一个新的图像窗口。参数:起始坐标(0,0)大小同上(Width,Height)背景颜色(’Black’)窗口句柄(WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*设置不依赖操作系统的字体。参数:窗口句柄(WindowHandle)字体大小(14)字体类型(’mono’)是否黑体(’ture’)是否倾斜(’false’)
dev_set_draw ('margin')
*//定义区域填充模式为(’Margin’或者’Fill’)
dev_set_line_width (3)
*设置输出区域轮廓线(圆圈)的线宽
dev_set_color ('red')
*设置圆圈颜色,一种或者多种
*
* 第二步,根据指定图像大小进行fft速度最优化
optimize_rft_speed (Width, Height, 'standard')
*优化图片大小(Width,Height)优化模式(’standard’)
* 1)结合两个高斯滤波器构造一个合适的滤波器
* 定义两个标准差常量
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)
* 参数:生成的高斯滤波器(GaussFilter)空域中高斯在主方向上的标准差(Sigma)空域中高斯在正交于主方向的方向上的标准差(Sigma)
* 滤波器主方向的角度(0.0)滤波器的规范(’none’)直流项在频域的位置(’rft’) 图片的大小(Width,Height)
sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
* 经高斯滤波后两图片灰度相减
* 2)进行傅里叶变换并对图像进行平滑处理,迭代运算
*迭代计算次数指允许公式反复计算的次数(迭代就是进行下一张图片检测,本例一共11个图片)
NumImages := 11
for Index := 1 to NumImages by 1
*for循环从1到11,步长(每次改变的量)为1,迭代11次
*(1)读取图像并将其转换为灰度值
read_image (Image, 'plastics/plastics_' + Index$'02')
*参数说明:为读入图片命名(Image)文件名(’plastics/plastics_02’)
*将原图转化为灰度图,第一个参数为原图
rgb1_to_gray (Image, Image)
*(2)对图像进行过滤。原图像-傅里叶-滤波-反傅里叶-滤波后灰图像
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
*对计算的一幅图片实部进行快速傅里叶变换。参数:输入的图片(Image)傅里叶变换后输出的图片(ImageFFT)
*变换正方向(’to_freq’或’from_freq’)变换因子的规范(’none’)输出图片的数据类型(’complex’)图片的宽(Width)
convol_fft (ImageFFT, Filter, ImageConvol)
*(3)对转换后图片用滤波器在频域进行卷积运算。参数:输入的图片(ImageFFT)频域滤波器(Filter)运算后输出的结果(ImageConvol)
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
*对滤波后的图片进行傅里叶反变换。参数:输入的图片(ImageConvol)运算后结果(ImageFiltered)变换反方向(’from_freq’)
* 第三步,处理过滤后的图像,灰度分割,圈分。
gray_range_rect (ImageFiltered, ImageResult, 10, 10)
*用一个矩形掩膜计算像素点的灰度范围。参数:输入的图片(ImageFiltered)灰度范围图(ImageResult)矩形掩膜大小(10,10)
min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
*判断区域内灰度值的最大和最小值。参数:待分析图片区域(ImageResult)图片(ImageResult)
*被去除的直方图两边像素点所占总像素数的百分比(0)得到的最小值最大值及灰度值范围(Min,Max,Range)
threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
*利用全局阈值算子分割图像。参数:输入的图片(ImageResult)分割后得到的区域(RegionDynThresh)
*阈值(MinGray=max([5.55,Max*0.8]),MaxGray=255)分割后图像灰度范围:MinGray <= RegionDynThresh <= MaxGray
connection (RegionDynThresh, ConnectedRegions)
*计算区域内的连通部分。参数:输入的图片(RegionDynThresh)得到的连通区域(ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)
*根据指定的形态特征选择区域。参数:输入的图片(ConnectedRegions)满足条件的区域(SelectedRegions)
*将要计算的形态特征(’area’)独立特征间的连接关系(’and’)特征的最小限制(4)特征的最大限制(99999)
union1 (SelectedRegions, RegionUnion)
*返回包含所有瑕疵区域的集合。参数:包含所有区域的待计算区域的图片(SelectedRegions)所有输入区域集合(RegionUnion)
closing_circle (RegionUnion, RegionClosing, 10)
*用一个圆圈表示瑕疵区域。参数:将要被封闭的区域(RegionUnion)被封闭的区域(RegionClosing)圆圈的半径(10)
connection (RegionClosing, ConnectedRegions1)
*计算封闭区域内的连通部分。参数:输入的图片(RegionClosing)得到的连通区域(ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
area_center (SelectedRegions1, Area, Row, Column)
*计算区域的面积以及中心位置。参数:待计算的区域(SelectedRegions1)区域的面积(Area)区域中心的行(Row)区域中心的列(Column)
*第四步,显示结果
dev_display (Image)
*显示原图
Number := |Area|
*将区域面积赋给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)
*参数:圈中缺陷的边界(ContCircle)圆弧或圆的中心坐标(Row,Cloumn)圆弧或圆的半径(gen_tuple_const(Number,30))
*圆弧或圆的起始角度(gen_tuple_const(Number,0))圆弧或圆的结束角度(gen_tuple_const(Number,rad(360)) 角度为正 相邻两点间的距离(1)
ResultMessage := ['Not OK',Number + ' defect(s) found']
Color := ['red','black']
dev_display (ContCircle)
*有缺陷时,对缺陷部分的处理结果。参数:结果信息['Not OK',缺陷数 + ' defect(s) found']字体颜色['Not OK'颜色,Number + ' defect(s) found'字体颜色]
*显示缺陷边界,(ContCircle)
else
ResultMessage := 'OK'
Color := 'forest green'
endif
disp_message (WindowHandle, ResultMessage, 'window', 12, 12, Color, 'true')
*功能:此过程将在图形窗口“WindowHandle”中以'window'窗口坐标系的位置(Row,Column)处显示文本编写一条ResultMessage文本消息。
*如果设置为image,则使用图像坐标;Box参数,如果设置为“ true”,则文本将写在橙色框中,如果设置为“ false”,则不会显示任何框。
if (Index != NumImages)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
endfor