******************************************第一步 初始化**************************************************
*读取一张图像
read_image (Hull, 'hull')
*获取图像大小
get_image_size (Hull, Width, Height)
*关闭已经打开的窗口
dev_close_window ()
*打开一个新的窗口
dev_open_window (0, 0, Width, Height, 'black', WindowID)
*显示图像
dev_display (Hull)
******************************************第二步 图像处理**************************************************
*阈值操作,分割出吸嘴
threshold (Hull, Dark, 0, 80)
*补集运算,获取背景区域
difference (Hull, Dark, Light)
*对背景区域进行连通处理
connection (Light, ConnectedRegions)
*过滤出背景区域
select_shape (ConnectedRegions, NoHullCand, 'area', 'and', 50000, 9999999)
*对过滤的背景区域进行闭运算,填充背景间隙和平滑背景边界
closing_circle (NoHullCand, NoHull, 13.5)
*补集运算,获取吸嘴区域
difference (Hull, NoHull, Region)
*对吸嘴区域开运算
opening_circle (Region, RegionOpening, 2.5)
*对吸嘴区域进行连通处理
connection (RegionOpening, ConnectedRegions)
*过滤出吸嘴区域
select_shape (ConnectedRegions, RegionHull, 'area', 'and', 5000, 9999999)
*将吸嘴区域转换为凸包区域
shape_trans (RegionHull, ConvexHull, 'convex')
*补集运算,获取吸嘴的缺口
difference (ConvexHull, RegionHull, Region)
*对吸嘴缺口区域进行连通处理
connection (Region, ConnectedRegions)
*过滤出吸嘴缺口
select_shape (ConnectedRegions, LargeHoles, 'area', 'and', 2000, 99999)
select_shape (LargeHoles, Holes, 'convexity', 'and', 0, 0.85)
*显示图像
dev_display (Hull)
*设置输出对象的线宽度
dev_set_line_width (5)
*设置区域的填充方式
dev_set_draw ('margin')
*设置输出对象显示颜色为红色
dev_set_color ('red')
*显示吸嘴缺口
dev_display (Holes)
*关闭程序计数器,图形变量更新,窗口图形更新
dev_update_off ()
*关闭已打开的窗口
dev_close_window ()
************************************************第一步: 获取图像**************************************************
*读取图像
read_image (Image, 'image.png')
*获取图像大小
get_image_size (Image, Width, Height)
*打开一个新窗口
dev_open_window_fit_image (Image, 0, 0, Width, Width, WindowID)
*设置字体信息:字体大小为16,字体为mono,粗体,斜体
set_display_font (WindowID, 16, 'mono', 'true', 'false')
*设置区域的填充方式
dev_set_draw ('margin')
*设置线宽度
dev_set_line_width (4)
*显示图像
dev_display (Image)
************************************************第二步: 分割图像**************************************************
* 均值滤波,滤波核大小为7*7
mean_image (Image, ImageMean, 7, 7)
* 用局部阈值进行分割
dyn_threshold (Image, ImageMean, DarkPixels, 5, 'dark')
* 联通处理
connection (DarkPixels, ConnectedRegions)
* 输出对象的显示颜色的数目
dev_set_colored (12)
dev_display (Image)
dev_display (ConnectedRegions)
************************************************第三步: 处理区域**************************************************
* 过滤出缺陷区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 1000)
dev_display (Image)
dev_display (SelectedRegions)
* 将SelectedRegions中的所有区域合并
union1 (SelectedRegions, RegionUnion)
* 对合并区域进行膨胀处理,其结构元素为圆形,半径为3.5
dilation_circle (RegionUnion, RegionDilation, 3.5)
dev_display (Image)
dev_display (RegionDilation)
Message := 'Region of the scratches after dilation'
* 对膨胀后的区域进行求骨架
skeleton (RegionDilation, Skeleton)
* 对获取的骨架区域进行连通处理
connection (Skeleton, Errors)
dev_set_colored (12)
dev_display (Image)
dev_display (Errors)
************************************************第三步: 获取大缺陷和小缺陷**************************************************
*过滤出大的缺陷
select_shape (Errors, Scratches, 'area', 'and', 50, 10000)
*过滤出小的缺陷
select_shape (Errors, Dots, 'area', 'and', 1, 50)
dev_display (Image)
dev_set_color ('red')
dev_display (Scratches)
dev_set_color ('blue')
dev_display (Dots)
*关闭程序计数器,图形变量,窗口图形更新
dev_update_off()
* Image Acquisition 01: Code generated by Image Acquisition 01
ImageFiles := []
ImageFiles[0] := '1.bmp'
ImageFiles[1] := '2.bmp'
for Index := 0 to |ImageFiles| - 1 by 1
*读取一张图像
read_image (Image, ImageFiles[Index])
*分割出环形区域
threshold (Image, Region, 100, 255)
*对区域进行连通处理
connection (Region, ConnectedRegions)
*过滤出圆环区域
select_shape (ConnectedRegions, SelectedConnectedRegions, ['area','circularity'], 'and', [40000,0.6], [99999,1])
*将圆环区域中的图像剪切出来
reduce_domain (Image, SelectedConnectedRegions, ImageReduced)
*将图像和高斯导数进行卷积运算
derivate_gauss (ImageReduced, DerivGaussImage, 1.5, 'gradient')
*分割出图像中的轮廓
threshold (DerivGaussImage, DerivGaussRegion, 9, 50)
*对轮廓区域进行连通处理
connection (DerivGaussRegion, DerivGaussConnectedRegions)
*获取的轮廓区域
select_shape_std (DerivGaussConnectedRegions, SelectedDerivGaussConnectedRegions, 'max_area', 70)
*填充该轮廓区域
fill_up (SelectedDerivGaussConnectedRegions, RegionFillUp)
*求轮廓区域和填充的轮廓区域之间的补集区域
difference (RegionFillUp, SelectedDerivGaussConnectedRegions, RegionDifference)
*对补集区域进行连通处理
connection (RegionDifference, ResultConnectedRegions)
*获取缺陷区域
select_shape (ResultConnectedRegions, DefectResult, 'area', 'and', 50, 999)
*显示图像
dev_display (Image)
*显示缺陷区域
dev_display (DefectResult)
stop()
endfor
*读取一张图像
read_image (Image, '原图.jpg')
*获取图像大小
get_image_size(Image, Width, Height)
*关闭已经打开的窗口
dev_close_window ()
*打开新窗口
dev_open_window(0, 0, Width, Height, 'black', WindowHandle) //打开指定大小的窗口
*对图像进行阈值操作
threshold (Image, Region, 0, 50)
*对区域进行连通处理
connection (Region, ConnectedRegions)
*过滤出产品的外轮廓区域
select_shape (ConnectedRegions, SelectedRegions, 'ra', 'and', 10, 200)
*对轮廓区域进行填充
fill_up (SelectedRegions, RegionFillUp)
*将区域转化为最小外接圆
shape_trans (SelectedRegions, RegionTrans, 'outer_circle')
*通过补集运算获取产品缺口区域
difference (RegionTrans, RegionFillUp, RegionDifference)
*对缺口区域进行腐蚀操作
erosion_circle (RegionDifference, RegionErosion, 1)
*把一个区域转变为一个二进制字节图像。
region_to_bin (RegionErosion, BinImage, 255, 0, 656, 492)
*对图像进行阈值操作
threshold (BinImage, Region1, 255, 255)
*对阈值区域连通处理
connection (Region1, ConnectedRegions1)
*设置输出对象显示颜色
dev_set_color('blue')
*过滤出想要的缺口区域
select_shape (ConnectedRegions1, SelectedRegions1, ['ra','rb'], 'and', [5,1], [10,5])
*统计出缺口的数目
count_obj (SelectedRegions1, Number)
*显示图像
dev_display (Image)
*显示缺陷区域
dev_display (SelectedRegions1)
*读取一张图像
read_image (Image, '1.jpg')
*将RGB图像转化为灰度图
rgb1_to_gray (Image, GrayImage)
*使用自动阈值分割图像前景区域
bin_threshold (GrayImage, Region)
*将前景区域中图像剪切出来
reduce_domain (GrayImage, Region, ClipImage)
*均值滤波
mean_image (ClipImage, ImageMean, 200, 3)
*局部阈值,分割出前景
dyn_threshold (ClipImage, ImageMean, RegionDynThresh, 7, 'light')
*对分割的区域闭运算,填充间隙,平滑边界
closing_circle (RegionDynThresh, RegionClosing, 3.5)
*连通处理
connection (RegionClosing, ConnectedRegions)
*过滤出三角形区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 500, 2000)
*填充三角形内部区域
fill_up (SelectedRegions, RegionFillUp)
*将三角形区域转换为凸度
shape_trans (RegionFillUp, RegionTrans, 'convex')
*将区域转换为轮廓
gen_contour_region_xld (RegionTrans, Contours, 'border')
*显示图像
dev_display(GrayImage)
*显示三角形区域
dev_display(Contours)
************************************************第一步: 程序初始化**************************************************
*关闭当前有打开的窗口
dev_close_window ()
*关闭程序计数器,图形变量,窗口图形更新
dev_update_off ()
*打开一个新窗口
dev_open_window (0, 0, 640, 512, 'black', WindowHandle)
*设置字体信息:字体大小为16,字体为mono,粗体,斜体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
stop ()
************************************************第二步: 批量读取图像**************************************************
*批量读取4张图像到Images图形变量里
read_image (Images, 'photometric_stereo/shampoo_label_0' + [1:4])
for I := 1 to 4 by 1
*从对象数组里选择对象元素
select_obj (Images, ObjectSelected, I)
*显示选择的图像
dev_display (ObjectSelected)
*延时0.5秒
wait_seconds (0.5)
endfor
************************************************第三步: 获取反照率和表面梯度**************************************************
* 物像里的光照方向
Tilts := [6.1,95.0,-176.1,-86.8]
* 光源和物体之间的角度
Slants := [41.4,42.6,41.7,40.9]
ResultType := ['gradient','albedo']
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])
* 显示反射图
dev_display (Albedo)
stop ()
* 使用梯度字段计算表面的高斯曲率,缺陷在曲率图像中通常易于检测
derivate_vector_field (Gradient, MeanCurvature, 1.0, 'mean_curvature')
************************************************第四步: 获取检测到的缺陷**************************************************
* 对曲率图像进行阈值
threshold (MeanCurvature, Region, -10, -0.07)
* 对区域进行开运算
opening_circle (Region, RegionOpening, 1)
* 对区域进行连通处理
connection (RegionOpening, ConnectedRegions)
* 将缺陷过滤出来
select_shape (ConnectedRegions, Defects, 'area', 'and', 50, 99999)
* 将区域转换为圆
shape_trans (Defects, Circle, 'outer_circle')
* 设置区域填充方式
dev_set_draw ('margin')
* 设置输出对象的显示颜色
dev_set_color ('red')
* 显示反射图
dev_display (Albedo)
* 显示缺陷
dev_display (Defects)
* 显示缺陷外圆
dev_display (Circle)
*读取一张图像
read_image (Image, '求网格的顶点.png')
*获取图像大小
get_image_size (Image, Width, Height)
*关闭已经打开的窗口
dev_close_window ()
*打开新窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*对图像均值滤波,滤波核大小3*3
mean_image(Image, ImageMean, 3, 3)
*对图像均值滤波,滤波核大小12*12
mean_image(Image, ImageMean2, 12, 12)
*通过局部阈值分割出网格区域
dyn_threshold(ImageMean, ImageMean2, RegionDynThresh, 5, 'dark')
*对网格区域进行连通处理
connection(RegionDynThresh, ConnectedRegions)
*过滤出网格区域
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 150, 9999999999)
*开运算,获取网格竖线
opening_rectangle1(SelectedRegions, RegionOpening1, 1, 10)
*开运算,获取网格横线
opening_rectangle1(SelectedRegions, RegionOpening2, 10, 1)
*交集运算,获取横线和竖线的交点
intersection(RegionOpening1, RegionOpening2, RegionIntersection)
*对交点区域进行连通处理
connection(RegionIntersection, ConnectedRegions1)
*获取交点的坐标位置:行,列坐标
area_center (ConnectedRegions1, Area, Row, Column)
*显示图像
dev_display (Image)
*显示网格交点
dev_display (ConnectedRegions1)
利用傅里叶变换
将图像从空间域转换为频域
处理后再将图像转换为空间域
************************************************第一 窗口初始化****************************************************
*关闭已经打开的窗口
dev_close_window ()
*关闭程序计数器,图形变量更新,窗口图形更新
dev_update_off ()
*读取一张图像
read_image (Image,'2.bmp')
*获取图像大小
get_image_size (Image, Width, Height)
*打开新的窗口
dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
*设置区域填充方式
dev_set_draw ('margin')
*设置线宽度
dev_set_line_width (2)
*设置输出对象显示颜色数目
dev_set_colored(12)
************************************************第二 图像预处理****************************************************
*优化FFT的速度
optimize_rft_speed (Width, Height, 'standard')
Sigma1 := 10.0
Sigma2 := 2.0
*构建高斯滤波器
gen_gauss_filter (GsFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
*构建高斯滤波器
gen_gauss_filter (GsFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)
*两个滤波器相减
sub_image (GsFilter1, GsFilter2, Filter, 1, 0)
************************************************第三 开始处理图像****************************************************
* Image Acquisition 01: Code generated by Image Acquisition 01
ImageFiles := []
ImageFiles[0] := '1.bmp'
ImageFiles[1] := '2.bmp'
for Index := 0 to |ImageFiles| - 1 by 1
*读取一张图像
read_image (Image, ImageFiles[Index])
*将RGB彩色图转化为灰度图
rgb1_to_gray (Image, Image)
*对灰度图进行反选
invert_image(Image, ImageInvert)
*将图像转化为频域图像
rft_generic (ImageInvert, ImageFFT, 'to_freq', 'sqrt', 'complex', Width)
*将频域图像和滤波核进行卷积运算
convol_fft (ImageFFT, Filter, ImageConvol)
*将频域图像转化为空间域图像
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
*创建一个ROI
gen_rectangle1(Rectangle,30,25,450,610)
*将ROI区域的图像剪切
reduce_domain(ImageFiltered, Rectangle, ROI)
*中值滤波
median_image(ROI, ImageMedian, 'circle', 20, 'mirrored')
*使用高斯核进行图像平滑
smooth_image (ROI, ImageSmooth, 'gauss', 8)
*通过阈值分割出缺陷区域
threshold (ImageSmooth, Regions, -0.0016783, -0.0006434)
*对缺陷区域进行连通处理
connection(Regions, ConnectedRegions)
*对区域进行膨胀操作
dilation_circle (ConnectedRegions, RegionDilation, 5)
*过滤出指定面积大小的缺陷
select_shape (RegionDilation, SelectedRegions, 'area', 'and', 800, 99999)
*根据区域生成XLD轮廓
gen_contour_region_xld (SelectedRegions, Contours, 'border')
*将XLD拟合成圆
fit_circle_contour_xld (Contours, 'atukey', -1, 2, 0, 5, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
*生成一个圆对象
gen_circle_contour_xld (ContCircle, Row, Column, Radius+20, 0, 6.28318, 'positive', 1)
*显示图像
dev_display (Image)
*显示圆标记
dev_display(ContCircle)
stop()
endfor
*读取图像
read_image (Image, 'pcb')
*关闭已经打开的窗口
dev_close_window ()
*获取图像大小
get_image_size (Image, Width, Height)
*打开新的窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*显示图像
dev_display (Image)
*执行灰度开运算
gray_opening_shape (Image, ImageOpening, 7, 7, 'octagon')
*执行灰度闭运算
gray_closing_shape (Image, ImageClosing, 7, 7, 'octagon')
*局部阈值操作,分割出电路断线
dyn_threshold (ImageOpening, ImageClosing, RegionDynThresh, 75, 'not_equal')
*显示图像
dev_display (Image)
*设置输出对象的显示颜色
dev_set_color ('red')
*设置区域的填充方式
dev_set_draw ('margin')
*显示电路断线区域
dev_display (RegionDynThresh)
* 关闭窗口
dev_close_window ()
*关闭程序计数器,图形变量,窗口图形更新
dev_update_off ()
*图像路径
Path := 'lcd/mura_defects_texture_'
*读取一张图像
read_image (Image, Path + '01')
*获取图像大小
get_image_size (Image, Width, Height)
*打开一个新窗口
dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
*设置字体信息:字体大小为16,字体为mono,粗体,斜体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*设置区域的填充方式
dev_set_draw ('margin')
*设置线宽度
dev_set_line_width (3)
*设置输出对象显示颜色
dev_set_color ('red')
for F := 1 to 2 by 1
read_image (Image, Path + F$'.2i')
*获取彩色图像的三个通道,R,G,B
decompose3 (Image, R, G, B)
*缺陷是暗斑。 因此,通过原始图像减去背景照明,从而使缺陷变得更加明显。
estimate_background_illumination (B, ImageFFT1)
*用缺陷图减去背景图
sub_image (B, ImageFFT1, ImageSub, 2, 100)
*中值滤波
median_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')
*提取分水岭盆地
watersheds_threshold (ImageMedian, Basins, 20)
*计算灰度共生矩阵的灰度值特性,暗斑的能量非常低
cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
*Energy小于0.05,Mask为1,否则为0
Mask := Energy [<=] 0.05
select_mask_obj (Basins, Defects, Mask)
* 显示图像
dev_display (Image)
* 显示缺陷
dev_display (Defects)
stop()
endfor
*关闭程序计数器,图形变量更新,窗口图形更新
dev_update_window ('off')
*读取一张图像
read_image (Image, 'plastic_mesh/plastic_mesh_01')
*关闭打开的窗口
dev_close_window ()
*获取图像大小
get_image_size (Image, Width, Height)
*创建一个新窗口
dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowHandle)
*设置字体信息:字体大小为16,字体为mono,粗体,斜体
set_display_font (WindowHandle, 18, 'mono', 'true', 'false')
*设置区域的填充方式
dev_set_draw ('margin')
*设置线宽度
dev_set_line_width (3)
for J := 1 to 14 by 1
*读取一张图像
read_image (Image, 'plastic_mesh/plastic_mesh_' + J$'02')
*均值滤波
mean_image (Image, ImageMean, 49, 49)
*局部阈值分割图像
dyn_threshold (Image, ImageMean, RegionDynThresh, 5, 'dark')
*对分割后的区域进行连通处理
connection (RegionDynThresh, ConnectedRegions)
*过滤出缺陷网孔区域
select_shape (ConnectedRegions, ErrorRegions, 'area', 'and', 500, 99999)
*统计出缺陷网孔的数目
count_obj (ErrorRegions, NumErrors)
*显示图像
dev_display (Image)
*设置对象的显示颜色
dev_set_color ('red')
*显示缺陷网孔
dev_display (ErrorRegions)
if (NumErrors > 0)
*显示产品NG
disp_message (WindowHandle, 'Mesh not OK', 'window', 24, 12, 'black', 'true')
else
*显示产品OK
disp_message (WindowHandle, 'Mesh OK', 'window', 24, 12, 'black', 'true')
endif
stop()
endfor
* 关闭窗口
dev_close_window ()
*关闭程序计数器,图形变量更新,窗口图形更新
dev_update_off ()
*设置图像路径
Path := 'lcd/mura_defects_blur_'
*读取一张图像
read_image (Image, Path + '01')
*获取图像大小
get_image_size (Image, Width, Height)
*创建一个新窗体
dev_open_window_fit_size (0, 0, Width, Height, 640, 480, WindowHandle)
*设置字体信息:字体大小为16,字体为mono,粗体,斜体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*设置区域的填充方式
dev_set_draw ('margin')
*设置线宽度
dev_set_line_width (3)
*设置输出对象的显示颜色
dev_set_color ('red')
ScaleFactor := 0.4
*获取lines_gauss算子Sigma, Low, High三个参数值
calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High)
for f := 1 to 3 by 1
*读取一张图像
read_image (Image, Path + f$'.2i')
*获取彩色图像的R,G,B三分量
decompose3 (Image, R, G, B)
* *将图像转化为频域图像
rft_generic (B, ImageFFT, 'to_freq', 'none', 'complex', Width)
*生成一个高斯滤波核
gen_gauss_filter (ImageGauss, 100, 100, 0, 'n', 'rft', Width, Height)
*将频域图像核高斯滤波核进行卷积运算
convol_fft (ImageFFT, ImageGauss, ImageConvol)
*将卷积后的图像转换为空间域图像
rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width)
*用缺陷图像减去背景图像(时域图像)
sub_image (B, ImageFFT1, ImageSub, 2, 100)
* 对上述图像进行抽点,变焦
zoom_image_factor (ImageSub, ImageZoomed, ScaleFactor, ScaleFactor, 'constant')
*获取变焦后的图像的ROI
get_domain (ImageZoomed, Domain)
*图像ROI进行腐蚀操作
erosion_rectangle1 (Domain, RegionErosion, 7, 7)
*获取变焦图像中ROI区域内的图像
reduce_domain (ImageZoomed, RegionErosion, ImageReduced)
*探测线和获取线宽度
lines_gauss (ImageReduced, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true')
*生成一个2D的齐次变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
*添加一个缩放因子到齐次变换矩阵
hom_mat2d_scale_local (HomMat2DIdentity, 1 / ScaleFactor, 1 / ScaleFactor, HomMat2DScale)
*仿射变换
affine_trans_contour_xld (Lines, Defects, HomMat2DScale)
* 显示图像
dev_display (Image)
* 显示线缺陷
dev_display (Defects)
stop ()
endfor