十 缺陷检测解决策略之三:频域+空域
read_image (Image, '矩形')
* 中间低频,四周高频
fft_image (Image, ImageFFT)
* 中间低频,四周高频
fft_generic (Image, ImageFFT1, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
* 中间高频,四周低频
rft_generic (Image, ImageFFT2, 'to_freq', 'sqrt', 'complex', 512)read_image (Image, '圆')
* 中间低频,四周高频
fft_image (Image, ImageFFT)
* 中间低频,四周高频
fft_generic (Image, ImageFFT1, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
* 中间高频,四周低频
rft_generic (Image, ImageFFT2, 'to_freq', 'sqrt', 'complex', 512)*******
* 猜方向
*******
read_image (Image, '菱形3')
rgb1_to_gray (Image, GrayImage)
* 中间低频,四周高频
fft_image (GrayImage, ImageFFT)
* 中间低频,四周高频
fft_generic (GrayImage, ImageFFT1, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
* 中间高频,四周低频
rft_generic (GrayImage, ImageFFT2, 'to_freq', 'sqrt', 'complex', 512)
dev_get_window (WindowHandle)
* 读取图像
read_image (Image1, 'test1.png')
* 转灰度图(空间域转频域)
rgb1_to_gray (Image1, GrayImage)
* 傅里叶变换
fft_image (GrayImage, ImageFFT)
* 生成矩形
gen_rectangle1 (ROI_0, 27.4359, 25.9474, 190.912, 261.505)
* 生成矩形
gen_rectangle1 (TMP_Region, 210.916, 276.316, 368.874, 522.453)
* 区域合并
union2 (ROI_0, TMP_Region, ROI_0)
* 绘制区域
paint_region (ROI_0, ImageFFT, ImageResult, 0, 'fill')
* 反傅里叶变换(频域转空间域)
fft_image_inv (ImageResult, ImageFFTInv)
* 显示结果图像
dev_display (ImageFFTInv)* 傅里叶变换
fft_generic (GrayImage, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
* 生成矩形
gen_rectangle1 (ROI_0, 27.4359, 25.9474, 190.912, 261.505)
gen_rectangle1 (TMP_Region, 210.916, 276.316, 368.874, 522.453)
* 生成矩形
* 区域合并
union2 (ROI_0, TMP_Region, ROI_0)
* 绘制区域
paint_region (ROI_0, ImageFFT, ImageResult, 0, 'fill')
* 反傅里叶变换(频域转空间域)
fft_image_inv (ImageResult, ImageFFTInv)
fft_generic (ImageResult, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'complex')
* 显示结果图像
dev_display (ImageFFTInv)
*******************
*高通滤波(允许高频通过,显示强化细节)
*******************
* 读取图像
read_image (Image, 'printer_chip/printer_chip_01')
* 转灰度图
rgb1_to_gray (Image, GrayImage)
* 获取图像大小(为什么获取图像大小)
get_image_size (GrayImage, Width, Height)
* 傅里叶变换
fft_generic (GrayImage, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
* 生成高通滤波(允许高频通过,显示强化细节)
gen_highpass (ImageHighpass, 0.1, 'none', 'dc_center', Width, Height)
* 反傅里叶变换
convol_fft (ImageFFT, ImageHighpass, ImageConvol)
* 反傅里叶变换
fft_generic (ImageConvol, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'complex')*******************
*低通滤波(允许低频通过,显示强化背景)
*******************
* 读取图像1.读取图像,并转灰度图像
read_image (Image, 'printer_chip/printer_chip_01')
* 转灰度图1.读取图像,并转灰度图像
rgb1_to_gray (Image, GrayImage)
* 获取图像大小
get_image_size (GrayImage, Width, Height)
* 傅里叶变换2.傅里叶变换,空间域转频域
fft_generic (GrayImage, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
* 生成低通滤波(允许低频通过,显示强化背景)
gen_lowpass (ImageLowpass, 0.1, 'none', 'dc_center', Width, Height)
* 反傅里叶变换3.对频域进行滤波操作4.反傅里叶变换,频域转空间域
convol_fft (ImageFFT, ImageLowpass, ImageConvol)
* 反傅里叶变换
fft_generic (ImageConvol, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'complex')read_image (Image2Ok5, 'C:/Users/Jumy/Documents/WXWork/1688858086618338/Cache/File/2024-07/2_OK5.tif')
rgb1_to_gray (Image2Ok5, GrayImage1)
mult_image (GrayImage1, GrayImage1, ImageResult, 0.009, 0)
emphasize (ImageResult, ImageEmphasize, 7, 7, 1)
fft_generic (ImageEmphasize, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
gen_highpass (ImageHighpass, 0.1, 'none', 'dc_center', 5472, 3648)
convol_fft (ImageFFT, ImageHighpass, ImageConvol)
fft_generic (ImageConvol, ImageFFT1, 'from_freq', -1, 'sqrt', 'dc_center', 'complex')
read_image (Image2Ok5, '2_OK5.tif')
rgb1_to_gray (Image2Ok5, GrayImage1)
mult_image (GrayImage1, GrayImage1, ImageResult, 0.009, 0)
emphasize (ImageResult, ImageEmphasize, 7, 7, 1)
fft_generic (ImageEmphasize, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
gen_highpass (ImageHighpass, 0.1, 'none', 'dc_center', 5472, 3648)
convol_fft (ImageFFT, ImageHighpass, ImageConvol)
fft_generic (ImageConvol, ImageFFT1, 'from_freq', -1, 'sqrt', 'dc_center', 'complex')
dev_update_off ()
dev_close_window ()
* 1.读取图像,并转灰度图像
* 读取图像
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 ('margin')
dev_set_line_width (3)
dev_set_color ('red')
* 优化傅里叶变换速度
optimize_rft_speed (Width, Height, 'standard')
* 参数设置
* 值越大,低频部分越多,区域越小
Sigma1 := 10.0
Sigma2 := 3.0
* 3.生成对应的滤波操作
* 高斯滤波(低频滤波)3.生成对应的滤波操作
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'dc_center', Width, Height)
* 高斯滤波(低频滤波)
gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'dc_center', Width, Height)
* 滤波相减
sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
* 遍历
NumImages := 11
for Index := 1 to NumImages by 1* 读取图像* 1.读取图像,并转灰度图像read_image (Image, 'plastics/plastics_' + Index$'02')*************************** 频域预处理*************************** rgb转灰度rgb1_to_gray (Image, Image)* 傅里叶变换2.傅里叶变换,空间域转频域* 2.傅里叶变换,空间域转频域fft_generic (Image, ImageFFT, 'to_freq', -1, 'none', 'dc_center', 'complex')* 高斯滤波4.对频域进行滤波操作* 4.对频域进行滤波操作convol_fft (ImageFFT, Filter, ImageConvol)* 反傅里叶变换(获取实部)5.反傅里叶变换,频域转空间域* 5.反傅里叶变换,频域转空间域fft_generic (ImageConvol, ImageFiltered, 'from_freq', 1, 'n', 'dc_center', 'real')*************************** 空间域(Blob分析)6.缺陷检测*************************** 6.缺陷检测* 决定方形区域内的灰度值,计算方形区域内的最大最小灰度的差,设置到每个图像点上* 增强对比度,图像增强的一种6.缺陷检测gray_range_rect (ImageFiltered, ImageResult, 10, 10)* 获取灰度的最大值、最小值、和范围(最大值-最小值)min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)* 阈值分割threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)* 连通connection (RegionDynThresh, ConnectedRegions)* 特征选取select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)* 合并区域union1 (SelectedRegions, RegionUnion)* 开运算closing_circle (RegionUnion, RegionClosing, 10)* 连通connection (RegionClosing, ConnectedRegions1)* 特征选取select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)* 获取面积和区域中心点area_center (SelectedRegions1, Area, Row, Column)* 显示图像dev_display (Image)* 遍历所有区域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)elseResultMessage := '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