目录
1、关闭窗口,读取原始胶囊图片(三通道),按给定的纵横比打开窗口
2、这里的目的是把图案里面的腔室切割出来,对后续的胶囊处理更加方便
1、access_channel(MultiChannelImage : Image : Channel : )
2、orientation_region(Regions : : : Phi)
3、vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
4、affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : )
5、gen_empty_obj( : EmptyObject : : )
6、gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )
7、concat_obj(Objects1, Objects2 : ObjectsConcat : : )
8、affine_trans_region(Region : RegionAffineTrans : HomMat2D, Interpolate : )
9、decompose3(MultiChannelImage : Image1, Image2, Image3 : : )
10、var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )
一、程序源码分析
* 这个示例演示了制药行业的一个应用程序,任务是检查自动填充胶囊的内容。
* 第一个图像(参考)用于定位泡孔形状内的腔室作为参考模型,然后使用该模型沿此参考形状重新排列后续图像。利用Blob分析对每个腔体的内容进行分割,最后根据一些形状特征进行分类。
1、关闭窗口,读取原始胶囊图片(三通道),按给定的纵横比打开窗口
-
该图像作为后续图像读取,位置变换的参考
dev_close_window ()
dev_update_off ()
read_image (ImageOrig, 'blister/blister_reference')
dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle)
dev_display(ImageOrig)*设置显示的字体,设置填充方式为边缘填充,设置线宽为3
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
![](https://i-blog.csdnimg.cn/blog_migrate/647cd0fbd16aa5a2b5991cae0b8fa6c4.png)
2、这里的目的是把图案里面的腔室切割出来,对后续的胶囊处理更加方便
*原图是彩色图像,提取第一通道图像
access_channel (ImageOrig, Image1, 1)
*阈值选取较亮的区域
threshold (Image1, Region, 90, 255)
*根据凸性补充区域
shape_trans (Region, Blister, 'convex')
*获得整个大区域的角度、中心点坐标、面积
orientation_region (Blister, Phi)
area_center (Blister, Area1, Row, Column)
*从点和角度计算刚性仿射变换(得到这个区域到0角度位置的仿射矩阵)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
*根据仿射矩阵把原图变换过
affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')
![](https://i-blog.csdnimg.cn/blog_migrate/c1166fe1e42f6ee6a364fc6c8b45c6ce.png)
3、这一段目的是找出五行三列的胶囊腔室
*创建一个空对象元组,类的实例化,防止空引用异常
gen_empty_obj (Chambers)
*通过循环遍历图像中的胶囊,(88,163)是第一个胶囊腔室的中心坐标,70、150是行、列方向相邻腔室之间的间距
for I := 0 to 4 by 1
Row := 88 + I * 70
for J := 0 to 2 by 1
Column := 163 + J * 150*得到正常药品所处区域的矩形
gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)
concat_obj (Chambers, Rectangle, Chambers)
endfor
endfor
stop()
![](https://i-blog.csdnimg.cn/blog_migrate/fdcee1e78b75fe725896b1a380339586.png)
4、这一部分是将找到的胶囊区域合并
*根据仿射矩阵把原图中的药品区域(就是上述的形状变换后的凸包区域)变换过去,其实就是找到ROI区域
affine_trans_region (Blister, Blister, HomMat2D, 'nearest_neighbor')
*差分大区域和每个药品的矩形小区域
difference (Blister, Chambers, Pattern)
*每个药品的矩形小区域联合起来
union1 (Chambers, ChambersUnion)
![](https://i-blog.csdnimg.cn/blog_migrate/83dea9d29e35ccc2fb0297f70e80e681.png)