当前位置:网站首页>halcon知识:区域(Region)上的轮廓算子(1)

halcon知识:区域(Region)上的轮廓算子(1)

2022-06-23 17:45:00 无水先生

一、提要

        在Region相关的算子中,有get_region_chain,意思就是对区域的外轮廓线进行提取,并以链式码格式存放。本篇详细告诉大家,get_region_chain原理和测试。

二. get_region_chain介绍

  功能:一个对象的轮廓(contour)作为链式码。

运算符 get_region_chain 返回区域的轮廓。轮廓是描述区域轮廓的一系列像素。轮廓“位于”该区域。它从最小的行号开始;在该行中具有最大列索引的像素处。旋转顺时针进行。该区域的孔被忽略。方向码(链码)定义如下:

 运算符 get_region_chain 以元组的形式返回代码。在非空区域的情况下,参数 Row 和 Column 为起点坐标,Chain 是当前点的方向码,指向下一个点坐标。在空区域的情况下,参数 Row 和 Column 为零,Chain 是空元组。该区域的孔被忽略。只能传递一个区域,并且必须只有一个连接组件。

三、测试代码

以下是我写的,“硬性”测试该函数的代码,代码和结果如下:

read_image (Image, 'f:/images/DOTS/block.jpg')
rgb1_to_gray(Image,gray)

get_image_size(gray,width,height)
* gen_rectangle1(rect,0,0,height,width)
fast_threshold (gray,rect,0, 50 , 7)
get_region_chain(rect, Row, Column, Chain)

gen_image_const(BlkImage,'byte',width,height)


tmpRow := Row
tmpClm := Column

solid:=[]
x:=[]
y:=[]
for I:=0 to |Chain|-1 by 1
    set_grayval(BlkImage, tmpRow, tmpClm, 228)
    ttsmp := Chain[I]

    switch( ttsmp )
        
    case 0:
          tmpClm := tmpClm + 1
          break
    case 1:
          tmpRow := tmpRow -1
          tmpClm := tmpClm +1 
          break
    case 2:
          tmpRow:=tmpRow -1 
          break
    case 3:
          tmpRow := tmpRow -1
          tmpClm := tmpClm -1 
          break
    case 4:
          tmpClm:=tmpClm-1
          break
    case 5:
          tmpClm := tmpClm -1
          tmpRow := tmpRow +1 
          break
    case  6:
          tmpRow := tmpRow +1 
          break
    case  7:
          tmpClm := tmpClm +1
          tmpRow := tmpRow +1  
          break
    
    endswitch
   

endfor
dev_display(BlkImage)

输入图Image:

输出图:BlkImage

四、关于get_region_contour

        运算符 get_region_contour 返回区域的轮廓。轮廓是线(Rows)和列坐标(Columns)的结果,描述了区域的边界。轮廓位于该区域上。它从最小的行号开始。在具有最大列索引的像素处。旋转方向为顺时针。轮廓的第一个像素与最后一个像素相同。该区域的孔被忽略。运算符 get_region_contour 以元组的形式返回坐标。空区域作为空元组传递。

read_image (Image, 'f:/images/DOTS/block.jpg')
rgb1_to_gray(Image,gray)

get_image_size(gray,width,height)
* gen_rectangle1(rect,0,0,height,width)
fast_threshold (gray,regin,0, 50 , 7)
* get_region_chain(rect, Row, Column, Chain)

get_region_contour(regin,row,col)

gen_image_const(BlkImage,'byte',width,height)



for I:=0 to |row|-1 by 1
    tmpRow :=row[I]
    tmpCol :=col[I]
    set_grayval(BlkImage, tmpRow, tmpCol, 228)
endfor
dev_display(BlkImage)

输入图:

 结果图:

结论:

 因为get_region_chain只能对单个区域实现轮廓提取,get_region_contour能对多区域实现轮廓提取,因此,get_region_contour算子更有优势。

原网站

版权声明
本文为[无水先生]所创,转载请带上原文链接,感谢
https://yamagota.blog.csdn.net/article/details/114142615