欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用形态学提取连续背景的断层(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

使用形态学提取连续背景的断层(erosion_rectangle1算子)
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