*光度立体技术检查药物背面的水泡是否破损。
*
*思路为:
-
1.读入多张从不同角度拍摄的药片包装的背面图像
-
2.应用光度立体法得到反照率图像和表面梯度图像
-
3.使用之前得到的表面梯度,计算表面的高斯曲率,得到高斯曲率图像
-
4. 对高斯曲率图像进行预处理和Blob分析,从而得到缺陷区域
-
5. 在图像中标记缺陷区域
-
初始化
dev_close_window ()
dev_update_off ()
dev_open_window (0, 0, 512, 512, ‘black’, WindowHandle)
*打开图形窗口。左上角坐标(0,0)宽与高(512)黑色窗体
set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
*设置窗体字体
Message := ‘Inspect the backside of a blister’
Message[1] := ‘using photometric stereo. In this case four’
Message[2] := ‘different light orientations were used.’
*1.一个框里多行信息方法2.在语句外输入显示内容方法
*提示’‘在4个不同的灯光方向图片上,使用光度立体视觉法,检查一个水泡的背面是否有缺陷’
disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
*信息框,显示内容为变量,代表上面输入的内容
disp_continue_message (WindowHandle, ‘black’, ‘true’)
*定义提示继续运行的文本框,内容为默认
stop () -
以不同的光照显示输入图像
read_image (Images, ‘photometric_stereo/blister_back_0’ + [1:4]) -
下面的for循环,依次显示4张从不同角度拍摄的药片包装的背面图像
for I := 1 to 4 by 1
select_obj (Images, ObjectSelected, I)
*将带有索引(从1开始)的图标对象从图标输入对象元组对象复制到输出对象。
*输入的元组(Images)复制后的对象(ObjectSelected)要选择的对象的索引(I)
dev_display (ObjectSelected)
*显示复制后的对象
disp_message (WindowHandle, ‘Acquire image ’ + I + ’ of 4’, ‘window’, 12, 12, ‘black’, ‘true’)
*显示。获取图像是4个中第I个
wait_seconds (0.5)
*延迟程序的执行(0.5s)。
endfor -
应用光度立体法确定反照率和表面梯度。多副有多个方向光源的图片。
Slants := [41.4,42.6,41.7,40.9]
*偏锋。物体平面与光照方向之间的角度(单位为度)。
Tilts := [6.1,95.0,-176.1,-86.8]
*倾斜。物体平面内光照方向的角度(单位为度)
ResultType := [‘gradient’,‘albedo’]
*输出结果的类型。[“梯度”、“反照率”].
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, ‘poisson’, [], []) -
光度立体技术重建一个表面。具有至少三个不同光照方向的输入图像数组(Images)重建的高度(HeightField)
*表面的梯度图像(Gradient)表面的反照率图像(Albedo)参上 参上 参上 重构方法的类型(泊松分布)
*泛型参数的类型与值(默认为空) -
显示反照率图像。二维纹理称为反照率,与表面的局部光吸收和反射特性相对应,不包括任何阴影效果。
dev_display (Albedo)
*显示反照率图像
disp_message (WindowHandle, ‘Albedo image’, ‘window’, 12, 12, ‘black’, ‘true’)
*文本框显示“Albedo image”
disp_continue_message (WindowHandle, ‘black’, ‘true’)
*同上
stop ()
*使用gradient field作为erivate_vector_field的输入来计算曲面的高斯曲率。
*在曲率图像中缺陷通常很容易检测到。
derivate_vector_field (Gradient, GaussCurvature, 1, ‘gauss_curvature’)
-
用高斯函数的导数卷积向量场。
*输入向量场(Gradient)过滤后的结果图像(GaussCurvature)高斯函数的变量(1)待计算分量(高斯曲率)
*检测缺陷
*在曲率图像中分割平板区域
regiongrowing (GaussCurvature, Regions, 1, 1, 0.001, 250)
*分割图像。输入图像(GaussCurvature)分割图像(Regions)测试像素之间的垂直与水平距离(光栅的高度)(1,1)
*将灰度值差小于或等于容差的点累加到同一对象中。容差(0.001)输出区域的最小面积(250)
select_shape (Regions, TabletRegions, [‘width’,‘height’], ‘and’, [150,150], [200,200])
-
通过宽和高的特征,进行特征选择。参数:待考察区域(Regions)满足条件的区域(TabletRegions)
*待检查的形态特征([‘width’,‘height’])独立特征间的连接关系(’and’)特征的最小限制([150,150])特征的最大限制([200,200])
shape_trans (TabletRegions, TabletRegions, ‘convex’)
*改变一个区域的形状。待转换区域(TabletRegions)改变后区域(TabletRegions)类型的转换(凸出)
union1 (TabletRegions, TabletRegions)
*返回集合。参数:包含所有区域的待计算区域(TabletRegions)所有输入区域集合(TabletRegions)
erosion_circle (TabletRegions, TabletRegions, 3.5)
*具有循环结构元素的侵蚀区域。被侵蚀的区域(TabletRegions)侵蚀后的区域(TabletRegions)循环结构元素的半径(3.5) -
寻找平板内部的缺陷
reduce_domain (GaussCurvature, TabletRegions, ImageReduced)
*减少图像的域。输入域(GaussCurvature)与新定义的域(TabletRegions)的交集为图像简化的域(ImageReduced)
abs_image (ImageReduced, ImageAbs)
*计算区域内的绝对灰度值。需要计算绝对灰度值的区域(ImageReduced)结果(ImageAbs)
threshold (ImageAbs, Region, 0.03, 255)
*利用全局阈值算子分割图像。输入的图片(ImageAbs)分割后(Region)阈值(0.03,255)
*分割后图像灰度范围:MinGray <= RegionDynThresh <= MaxGray
closing_circle (Region, RegionClosing, 10.5)
*用一个圆圈表示瑕疵区域。参数:含有瑕疵的区域(Region)瑕疵区域(RegionClosing)圆圈的半径(10.5)
connection (RegionClosing, ConnectedRegions)
*计算区域的连通分量。参数:输入的图片(RegionClosing)连接组件(ConnectedRegions)
select_shape (ConnectedRegions, Defects, ‘area’, ‘and’, 10, 99999)
*根据指定的形态特征选择区域。参数:输入的图片(ConnectedRegions)满足条件的区域(Defects)
*将要计算的形态特征(’area’)独立特征间的连接关系(’and’)特征的最小限制(10)特征的最大限制(99999)
area_center (Defects, Area, Row, Column)
*获得缺陷区域的中心。待检查区域(Defects)选择区域的大小(Area)中心坐标(Row, Column)
gen_circle (Circle, Row, Column,20.5)
*gen_tuple_const(|Row|,20.5)
*创建一个圆。生成的圆(Circle)圆心坐标索引(Row, Column)圆的半径(20.5) -
在曲率图像中显示缺陷
dev_set_draw (‘margin’)
*定义圆区域填充模式(边缘)
dev_set_color (‘red’)
*圆为红色
dev_set_line_width (2)
*圆宽2
dev_display (GaussCurvature)
*在窗口显示曲率图像
dev_display (Circle)
*在窗口显示定义的圆
Message := ‘The defect can easily be detected’
Message[1] := ‘in the surface curvature image’
*文本显示的两行内容
disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
stop () -
在反照像中显示缺陷
dev_set_draw (‘margin’)
dev_set_color (‘red’)
dev_display (Albedo)
*在窗口显示反照率图像
dev_display (Circle)
*同上
disp_message (WindowHandle, ‘Defect in albedo image’, ‘window’, 12, 12, ‘black’, ‘true’)