使用形态学提取连续背景的断层(erosion_rectangle1算子)

   本文是针对检验图形纹理是否条理分明,使用形态学的方法对其进行验证,最终输出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,有问题的小伙伴请留言交流,一起学习!

发布了4 篇原创文章 · 获赞 4 · 访问量 234

猜你喜欢

转载自blog.csdn.net/weixin_44503397/article/details/104716784