一、预处理+定位(分割)+特征
求两个区域的交集
intersection (Region1, Region2, RegionIntersection)
输入区域1(区域1 要与区域2 中所有区域相交,大于等于区域2)
输入区域2
输出交集区域
求区域在图像像中的最小最大灰度值
min_max_gray (RegionIntersection, ImageReduced, 0, Min, Max, Range)
输入区域 输入图像 百分比(0-50) 最小灰度值 最大灰度值 范围(最大灰度值,最小灰度值之差)
求区域特征
region_features (RegionOpening, 'area', Value)
输入区域 输入特征 输出值
求灰度特征
gray_features (SelectedRegions, H, 'mean', Value1)
输入区域 输入图像 输入特征 输出值
二、差分--定位(缺陷图减去标准图得到缺陷)
注意:进行差分运算的两个区域或图像一定要重合,大的减小的
gray_opening_shape (Pcb, ImageOpening, 7, 7, 'octagon') //灰度开运算(增加暗像素)
gray_closing_shape (Pcb, ImageClosing, 7, 7, 'octagon') //灰度闭运算(增加亮像素)
输入图像 输出图像 结构元素大小(高、宽) 结构元素形状(矩形,八角形,菱形)
图像差分(缺陷图减去标准图得到缺陷)
sub_image (Image1, Image2, ImageSub, 1, 128)
图像1 图像2 减法得到的图像 乘1 加128
图像相乘(图像整体像素变大,黑白像素对比度拉开)
mult_image (Image, Image, ImageResult, 0.05, 0)
图像1 图像2 乘法得到的图像 乘0.05 加0
将区域绘制到图像中
paint_region (RegionTrans, Image, ImageResult, 255, 'fill')
输入区域 输入图像
输出图像 区域的灰度值 填充
区域差分
difference (Region1,Region2 , RegionDifference)
输入区域 输入要处理区域
输出相减得到的区域
印刷差分步骤
前提:把所有图像都转标准位置让差分对比区域重合
1、创建差分模型
create_variation_model (Width, Height, 'byte', 'standard', ModelID1)
图像宽高 一个字节 算法 模型句柄
2、训练
train_variation_model (ImageAffine1, ModelID1)
训练的图片 模型句柄
3、获得标准图
get_variation_model (ImageRE, VarImage, ModelID1)
平滑图像 边缘图像 模型句柄
4、设置参数
prepare_variation_model (ModelID1, 20, 5)
模型句柄 阈值(越大要求越高)要求越低越容易找错(一些小边缘也能找出来)
5、循环采图进行差分
compare_variation_model (ImageReduced3, Region2, ModelID1)
对比图像 输出与模板图不同区域 句柄
三、频域
傅里叶变换-针对光滑表面的微小缺陷(周期性正弦噪声)
空间到频域 -- 傅里叶变换 --输出频谱图
傅里叶正逆变换
空间图像转频域图像
fft_generic (ImageSub, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
输入图像 输出频域图像 空间到频域(to_freq) 符号(反着填,不然转回空间域图像会镜像) 归一化系数(亮度)位置(默认dc_center) 输出图像类型(频域图像选 'complex')
频域图像转空间图像
fft_generic (ImageSub, ImageFFT, 'from_freq', 1, 'sqrt', 'dc_center', 'real')
输入频域图像 输出图像 频域到空间(from_freq) 符号 归一化因子 位置(默认dc_center) 输出图像类型(图像选 'real' 或 'byte')
生成低通滤波器
gen_lowpass (ImageLowpass, 0.1, 'none', 'dc_center', Width, Height)
输出滤波器(中心有个小圆孔的图像,中间灰度值为1,四周为0,计算时只要中间低频率) 中心圆孔大小 归一化因子 位置 图像宽高
生成高通滤波器
gen_highpass (ImageHighpass, 0.1, 'none', 'dc_center', Width, Height)
输出滤波器(中心有个小圆孔的图像,中间灰度值为0,四周为1,计算时只要四周高频率) 中心圆孔大小 归一化因子 位置 图像宽高
频域乘法
convol_fft (ImageLowpass, ImageLowpass, ImageConvol)
输入频域图像 输入滤波器 (频域图像放在前面)
输出结果频域图像
生成高斯滤波器
gen_gauss_filter (ImageGauss, 1, 1, 0, 'none', 'dc_center', 512, 512)
输出图像 sigmal水平值(越大越平滑(越大光斑越小)) sigmal垂直值 方向 归一化因子 位置 图像大小
根据灰度范围差处理()
gray_range_rect (ImageFFT, ImageResult, 11, 11)
输入图像
输出图像
掩膜大小
生成正弦形状的带通滤波器
gen_sin_bandpass (ImageFilter, 0.1, 'none', 'dc_center', 512, 512)
输出滤波器图像
输入正弦值 归一化因子 位置 图像大小
纹理检测
texture_laws (ImageFilter, ImageTexture, 'el', 2, 5)
输入图像
输出纹理图像
分水领域法
把图像灰度值分成一块一块的区域,区域中心灰度值小,区域边缘灰度值大,区域边缘减去两边中心的最大灰度值之差小于设定阈值合并
watersheds_threshold (ImageMedian, Basins1, 10)
输入图像,输出区域,分水岭的阈值
用分水领域法分割图像后,再用灰度特征--熵(gray_entropy) 筛选区域 区域灰度值越杂乱熵越大
四、光度立体重建
光度立体重建
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, 'all', 'poisson', [], [])
输入图像(多张) 高度场 梯度场 反射率图 两个角度 结果类型 泊松方程 参数名 参数值
将梯度场转成曲率图
derivate_vector_field (Gradient, MeanCurvature, 3.0, 'mean_curvature')
梯度场 输出曲率 平滑系数 曲率类型
'divergence'
'curl'
'mean_curvature'
'gauss_curvature'
五、mlp分类器
ocr字符识别
创建分类器模型
create_ocr_class_mlp (8, 10, 'constant','default', ['六边形','圆','齿轮'], 20, 'normalization', 10, 42, OCRHandle)
物料宽高 插值算法 特征名称(默认值) 输出种类的名称 中间层隐式节点数量(神经元数量) 特征值的预处理('normalization'--映射到0和1) 特征值的对应预处理值(前面选 'normalization' 不用管这个值) 随机数种子 模型句柄
添加样本--生成trf文件
append_ocr_trainf (ObjectSelected, Image, ClassName[I], 'D:/train_ocr525.trf')
区域 图像 种类名称 保存路径
训练
trainf_ocr_class_mlp (OCRHandle, 'D:/train_ocr525.trf', 500, 0.1, 0.01, Error, ErrorLog)
模型句柄 样本文件路径 迭代次数(不能写太小) 权重阈值 误差阈值 输出误差 输出每次误差(每次误差组成的数组,最后一次误差就是输出误差)
识别
do_ocr_single_class_mlp (ObjectSelected1, Image, OCRHandle, 1, Class, Confidence)
区域 图像 模型句柄 种类个数(种类写几个输出几个结果和概率) 输出结果 概率
清除
clear_ocr_class_mlp (MLPHandle1)
mlp分类器
创建分类器(构建神经网络)
create_class_mlp (1, 10, 3, 'softmax', 'normalization', 10, 42, MLPHandle)
输入特征数量(输入层) 中间层隐式节点数 输出种类数量(输出层) 分类函数 特征值的预处理('normalization'--映射到0和1) 特征值的对应预处理值(前面选 'normalization' 不用管这个值) 随机数种子 模型句柄
添加样本
add_sample_class_mlp (MLPHandle, FeatureVector, ClassIDs[Index])
模型句柄 特征值(对应创建输入层) 种类对应索引(0开始)
训练
train_class_mlp (MLPHandle, 200, 0.1, 0.01, Error, ErrorLog)
模型句柄 迭代次数(不能写太小) 权重阈值 误差阈值 输出误差 输出每次误差(每次误差组成的数组,最后一次误差就是输出误差)
识别
classify_class_mlp (MLPHandle1, FeatureVector, 1, Class, Confidence)
输入句柄 输入特征值 种类个数(种类写几个输出几个结果和概率) 结果 概率
清除
clear_class_mlp (MLPHandle1)
保存模型
write_class_mlp (MLPHandle, 'D:/MyClass.gmc')
读入模型
read_class_mlp ('D:/MyClass.gmc', MLPHandle1)
FeatureVector:=real(FeatureVector) real 实数
六、测量拟合
1、一维测量长度判断是否ok
2、二维测量拟合标准形状,原形状边缘点到拟合标准形状的距离做判断
计算原轮廓每个点到拟合形状每个顶点的距离,再求出到每个最近顶点的距离,保证一个轮廓点连线一个顶点,去掉四个角的区域(比如小于7像素的点不要)
计算所有轮廓点到一个矩形的距离,距离超过多少NG
得到xld轮廓各个点的坐标
get_contour_xld (Rectangle, Row1, Col)
输入轮廓 行列坐标
轮廓上的点到拟合矩形的距离
dist_rectangle2_contour_points_xld (Rectangle, 0, Row, Column, Phi1, L1, W1, Distances)
输入轮廓 忽略点 矩形中心的行列坐标 角度 半宽 半高 距离