图像的骨架特征,可以简单地理解为图像的中轴。骨架虽然从原来的物体图像中去掉了一些点,但仍然保持了原来物体的结构信息。骨架提取技术可以用于压缩图像,用在图像识别中可以降低计算量。
①火烧模型。即图像的四周被相同火势点燃,燃烧速度一致,火势由图像四周向内部燃烧时,火焰相与处即为骨架。
②最大圆盘法。最大圆盘为完全包含在物体内部并且与物体边界至少有两个切点的圆,而骨架就是由目标内所有内切圆盘的圆心组成的。
Regions / Transformations 计算区域的骨架。 skeleton(Region : Skeleton : : ) Region:输入参数,输入的区域。 Skeleton:输出参数,生成的骨架,Skeleton == Region。 |
距离变换是一种通常只应用于二值图像的算子。变换的结果是一个与输入图像相似的灰度图像,除了改变前景区域内点的灰度强度以显示从每个点到最近边界的距离。
Regions / Transformations 计算区域每个点到区域边缘的距离变换,并将距离信息赋值到图像中。 distance_transform(Region : DistanceImage : Metric, Foreground, Width, Height : ) Region:输入参数,目标区域。 DistanceImage:输出参数,距离图像。 Metric:输入参数,用于测量距离的方法。默认 'city-block' 【 'chamfer-3-4',沿每个点到边缘的平行和垂直移动的权重为3,对角线移动的权重为4的方向计算最近距离。 'chamfer-3-4-unnormalized',同上,抑制归一化,可以减少运算量。 'chessboard',沿每个点到边缘的垂直、平行和对角的方向计算最近距离。 'city-block',沿每个点到边缘的垂直和平行的方向计算最近距离。 'euclidean',沿每个点到边缘的欧几里得距离。 'octagonal',沿每个点到边缘的垂直、平行和对角线(权值更高)的方向计算最近距离。 】 Foreground:输入参数,计算方式设置。默认 'true' 【'false'在区域外所有的点到区域的边缘, 'true'计算区域内所有的点到区域边缘的距离】 Width:输入参数,输入的计算距离的范围宽度。1 ≤ Width Height:输入参数,输入的计算距离的范围高度。1 ≤ Height 这里的Width,Height一般情况是等于图片的分辨率大小,但是范围值也可以设定为:要计算的区域包含在设定的分辨率内。 |
***distance_transform算子的用法错误
read_image(Image,'D:/Documents/Desktop/Snowcity.png')
rgb1_to_gray(Image, GrayImage)
threshold (GrayImage, Regions, 0, 225)
*错误的分辨率参数输入
distance_transform(Regions, DistanceImage1, 'city-block', 'true', 640, 480)
*正确的分辨率参数输入
distance_transform(Regions, DistanceImage2, 'city-block', 'true', 750, 564)
在正常情况下,物体上的点到物体的中轴(骨架)的距离应该在一定范围之内,如果存在偏差超过一定范围,则可以判断为存在缺陷。因此,可以先通过distance_transform算子,获得目标区域点到边缘的距离分布图像,再通过skeleton算子得到目标区域的骨架。
因为距离变换的图像是一个灰度图像,有差异的地方对应的骨架灰度值跟周围没有差异的骨架的灰度值不一样,这样就可以利用threshold算子将这些不同的地方区分开。
*筛选出缺陷点
read_image(Image,'D:/Documents/Desktop/Snowcity.png')
rgb1_to_gray(Image, GrayImage)
*区域阈值分割
threshold (GrayImage, Regions, 0, 225)
*计算一个区域Regions的距离变换,输出一个图像
distance_transform(Regions, DistanceImage1, 'city-block', 'true', 637, 347)
*提取Regions的骨架
skeleton(Regions, Skeleton1)
*将距离变换后的灰度图像缩小至Skeleton1骨架大小(基于区域)
reduce_domain(DistanceImage1, Skeleton1, ImageReduced)
*灰度阈值分割,最亮和最暗的地方都是有缺陷的地方
threshold(ImageReduced, Region1, 0, 19)
threshold(ImageReduced, Region2, 23, 127)
*将提取出的两个区域合并为一个区域
union2(Region1,Region2, RegionUnion)
*连通独立的区域
connection(RegionUnion, ConnectedRegions)
*输出每个独立区域的中心点和面积
area_center(ConnectedRegions, Area, Row, Column)
*以这些坐标将这些位置以十字标定出来
dev_display(GrayImage)
dev_set_color('yellow')
*这里的200000根据自己窗口的句柄去更改
disp_cross(200000,Row, Column, 20, 0)
参考文献:
杜斌—《机器视觉 使用HALCON描述与实现》
【halcon】 distance_transform 边缘距离转换 (by shany shang)https://blog.csdn.net/szx123_/article/details/104405332