【issue-halcon例程学习】atoms.hdev

例程功能

 定位原子网格结构中的不规则性。

代码如下

dev_close_window ()
dev_update_window ('off')
* ****
* Acquire image
* ****
read_image (Image, 'atoms')
get_image_size (Image, Width, Height)
crop_rectangle1 (Image, Image, Height / 2, 0, Height - 1, Width - 1)
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowID)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (2)
dev_display (Image)
disp_message (WindowID, 'Original image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* Segment image
* ****
* -> Using watershed
gauss_filter (Image, ImageGauss, 5)
watersheds (ImageGauss, Basins, Watersheds)
dev_display (Image)
dev_set_colored (12)
dev_display (Watersheds)
disp_message (WindowID, 'Watersheds', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* Process regions
* ****
* -> Skip regions at the border of the image
smallest_rectangle1 (Basins, Row1, Column1, Row2, Column2)
select_shape (Basins, SelectedRegions1, 'column1', 'and', 2, Width - 1)
select_shape (SelectedRegions1, SelectedRegions2, 'row1', 'and', 2, Height - 1)
select_shape (SelectedRegions2, SelectedRegions3, 'column2', 'and', 1, Width - 3)
select_shape (SelectedRegions3, Inner, 'row2', 'and', 1, Height - 3)
* -> Select irregularly shaped atoms
select_shape (Inner, Irregular, ['moments_i1', 'moments_i1'], 'or', [0, 9.5e8], [1.5e8, 1e10])
dev_display (Image)
dev_set_line_width (1)
dev_set_color ('white')
dev_display (Inner)
dev_set_line_width (3)
dev_set_color ('red')
dev_display (Irregular)
disp_message (WindowID, 'Defects', 'window', 12, 12, 'black', 'true')

要点

  1. 分水岭算法
    • 算法介绍:一种典型的基于边缘的图像分割算法。通过寻找区域之间的分界线,对图像进行分割。传统的分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是地质学上的拓扑地貌,图像中每一像素的灰度值表示该点的海拔高度,每一个局部极小值及其周边区域称为集水盆地,而集水盆地的边界则形成分水岭。(可以找个演示视频理解,有需要的话用convert_image将像素值线性取反 )
    • 适用场景:于复杂背景下的目标分割,特别是具有蜂窝状结构画面的内容分割
    • 注意点:如果输入图像包含过多噪点或细节输出的区域数量将非常庞大并影响算法速度。因此前驱函数应考虑滤波;
    • 相关算子:watersheds(Image:Basins,Watersheds::)watersheds_threshold(Image:Basins:Threshold:)
      后者在前者的结果上设置了Threshold,相邻区域像素差值小于Threshold则合并。
	gauss_filter (Image, ImageGauss, 5) //Image已读
	watersheds (ImageGauss, Basins, Watersheds)
  1. select_shape ——几何矩moments_i1(没看明白,先放放)
    • 矩的本质:数学期望,即可能结果的概率乘以其结果的总和;

    • 几何矩:用来表示图像的几何特征(质心、方向等)的矩,包括包括空间矩、中心矩、归一化中心矩;
      空间矩(spatial moments): 实质为面积或者质量。可以通过一阶矩计算质心/重心。计算公式如下:
      m j i = ∑ x , y ( a r r a y ( x , y ) ⋅ x j ⋅ y i ) m_{ji} = \sum_{x,y}^{} \left ( array \left ( x,y \right ) \cdot x ^{j} \cdot y^{i} \right ) mji=x,y(array(x,y)xjyi)
       可以看出对于01二值化的图像,m00即为轮廓的面积。
      中心矩(central moments): 体现的是图像强度的最大和最小方向(中心矩可以构建图像的协方差矩阵),其只具有平移不变性,所以用中心矩做匹配效果不会很好。计算公式如下:
      m u j i = ∑ x , y ( a r r a y ( x , y ) ⋅ ( x − x ˉ ) j ⋅ ( y − y ˉ ) i ) mu_{ji} = \sum_{x,y}^{} \left ( array \left ( x,y \right ) \cdot \left ( x-\bar{x} \right ) ^{j} \cdot \left ( y-\bar{y} \right )^{i} \right ) muji=x,y(array(x,y)(xxˉ)j(yyˉ)i)
       其中 x ˉ = m 10 m 00 \bar{x}=\frac{m_{10}}{m_{00}} xˉ=m00m10 y ˉ = m 01 m 00 \bar{y}=\frac{m_{01}}{m_{00}} yˉ=m00m01, ( x ˉ , y ˉ ) \left ( \bar{x},\bar{y} \right ) (xˉ,yˉ)为区域质心。
       这种计算质心的方法优点在于对噪声不敏感,即存在噪声时对结果影响不大。从数学角度看,这种方法只计算一个连通域region或一个团块block的质心。若存在两个质心,需分开求解,而非整体质心。
      归一化的中心矩(normalized central moments): 归一化后具有尺度不变性.计算公式如下:
      n u j i = m u j i m 00 ( i + j ) / 2 + 1 nu_{ji} = \frac{mu_{ji}}{m_{00}^{\left ( i+j \right )/2+1 } } nuji=m00(i+j)/2+1muji

    • 不变矩:即图像经过平移、旋转、缩放以后值不变的矩,是矩中的特殊情况,常见的不变矩有Hu矩(几何不变矩)、Zernike矩(正交不变矩)等;

    • 零阶矩(m00):与图像或某个轮廓的面积相关;
      一阶矩(m10,m01):与图像或某个轮廓的质心相关;
      二阶矩(m20,m11,m02):与图像或某个轮廓的旋转半径相关;
      三阶矩(m30,m21,m12,m03):与图像或某个轮廓的斜度或扭曲程度相关;

你可能感兴趣的:(计算机视觉)