使用形态学提取连续背景的断层(erosion_rectangle1算子)
程序员文章站
2022-07-04 16:04:26
...
本文是针对检验图形纹理是否条理分明,使用形态学的方法对其进行验证,最终输出OK或者NG的结果。
顺便认识新算子:decompose3、erosion_rectangle以及语法for循环
![原图](https://img-blog.csdnimg.cn/20200307195735519.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUwMzM5Nw==,size_16,color_FFFFFF,t_70)
ImageName := 'solar_cell/solar_cell_'
read_image (Image, ImageName + '01')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_color ('red')
dev_set_draw ('margin')
dev_set_line_width (2)
umImages := 6
for Index := 1 to NumImages by 1
//简单的for循环语句,与forend嵌套使用,其中Index表示循
环自变量,从1到NumImages,每次逐步加1
read_image(Image, ImageName + Index$'02')
decompose3 (Image, ImageR, ImageG, ImageB)
//我们知道色彩的三元素分别为R、G、B,即每一个颜色例如草莓
红、沙漠黄等都是由R、G、B三种颜色通过不同的比例混合而得到
的,所以在处理彩色图片的时候我们基本上都会用到算子decompose
来将原图分解成容易被处理的R、G、B三种黑白图
threshold (ImageR, Region, 0, 159)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, GoodSmallParts, ['area','width'], 'and', [3500,130], [5000,300])
select_shape (ConnectedRegions, GoodLongParts, ['area','width'], 'and', [6000,350], [10000,550])
select_shape (ConnectedRegions, Clutter, ['width','height','area'], 'or', [900,900,0], [1000,1000,100])
//当我们需要筛选出需要特征的图片时,使用select_shape算子,
当筛选特征有两个或多个时,我们可以用[ ]将两个特征括起来一
起使用,可以方便算法的操作
difference (ConnectedRegions, GoodSmallParts, Difference)
difference (Difference, GoodLongParts, Difference)
difference (Difference, Clutter, BrokenParts)
shape_trans (BrokenParts, BrokenPartsTrans, 'rectangle1')
erosion_rectangle1 (BrokenParts, RegionErosion, 1, 25)
//算子erosion_rectangle1可以侵蚀具有矩形结构元素的区域
它是非常快速的操作,因为矩形的高度仅以对数形式输入,而宽
度完全不输入。即使在非常大的矩形(边长> 100)的情况下,
这也可以实现出色的运行效率。
注意!!!!:要在各个方向上减少相同的数量,宽度和高度
必须为**奇数** 。如果不是这种情况,则该区域在右侧或底部
的腐蚀量分别于左侧或顶部的腐蚀量。
connection (RegionErosion, ConnectedBreaks)
shape_trans (ConnectedBreaks, Breaks, 'outer_circle')
dilation_circle (Breaks, Breaks, 6)
select_shape (Breaks, Breaks, 'area', 'and', 1, 99999999)
count_obj (Breaks, CountBreaks)
if (CountBreaks == 0)
//条件if语句,与endif嵌套使用,使用原理与C语言一样
disp_message (WindowHandle, 'Cell OK', 'window', 12, 12, 'black', 'true')
else
disp_message (WindowHandle, 'Cell not OK', 'window', 12, 12, 'red', 'true')
endif
//disp_message算子是用来指在图像显示界面实现结果的显示作用
if (Index != NumImages)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
if (CountBreaks == 1)
dev_open_window (0, 610, 300, 300, ‘black’, WindowHandle1)
area_center (Breaks, Area, Row, Column)
dev_set_part (Row[0] - 50, Column[0] - 50, Row[0] + 50, Column[0] + 50)
dev_display (Image)
dev_display (BrokenPartsTrans)
dev_display (Breaks)
stop ()
dev_set_window (WindowHandle1)
dev_close_window ()
endif
endfor
每天一个小Demo,有问题的小伙伴请留言交流,一起学习!
下一篇: halcon如何识别圆形