LabVIEW图像分割算法(基础篇—6)

LabVIEW图像分割算法(基础篇—6)图像分割是简化机器视觉算法的有效手段之一。它将图像分成一些有意义的区域,以便特征提取过程可基于这些区域提取目标的特征。

大家好,又见面了,我是你们的朋友全栈君。

目录

1、图像阈值分割

1.1、全局阈值分割

1.1.1、手动阈值分割

1.1.2、自动阈值分割

1.2、局部阈值分割

1.3、阈值分割算法比较

2、图像边缘分割

2.1、点检测

2.2、线检测

2.3、轮廓提取

3、图像形态学分割

3.1、像素的形态学处理

3.2、颗粒的形态学处理

4、图像区域分割


机器视觉系统基于数字图像中的信息进行决策。若系统算法不分主次,让所有图像数据都参与到目标识别或分类的计算过程中,机器视觉系统的实时性就很难得到保证。为了确保系统的实时性,最大限度地利用系统的能力,有必要关注”关键信息”。在机器视觉工程实践中,通常会先确定一个或多个能有效代表被测目标的量化特征,再基于这些特征完成机器决策任务,从而提高系统自动识别的能力。

图像分割是简化机器视觉算法的有效手段之一。它将图像分成一些有意义的区域,以便特征提取过程可基于这些区域提取目标的特征。此处提到的区域是指其中所有像素都相邻或相接触的集合,是像素的连通集。连通集中任意两个像素之间都存在一条完全由该集合的元素构成的连通路径。连通路径是一条可在相邻像素间移动的路径。

图像分割的基础是像素的相似性和跳变性,如灰度、纹理相似或突变等。经图像分割过程得到的区域一般互不交叠,每个区域内部的某种特性相同或接近,而不同区域间的特性则有明显差别。

图像分割的方法较多,依据处理的对象不同可分为点、线和区域分割法。若根据分割算法来分,则有阈值分割法、边缘分割法、区域分割法和形态学分割法等,如下图所示:

LabVIEW图像分割算法(基础篇—6)

1、图像阈值分割

图像阈值分割(thresholding)是一种最常用的图像分割方法,可将图像按照不同灰度分成两个或多个等间隔或不等间隔灰度区间,对目标与背景有较强对比度的图像分割特别有用。主要利用检测目标与背景在灰度上的差异,选取一个或多个灰度阈值,并根据像素灰度与阈值的比较结果对像素进行分类,用不同的数值分别标记不同类别的像素,从而生成二值图像。由于物体与背景以及不同物体之间的灰度通常存在明显差异,在图像灰度直方图中会呈现明显的峰值,因此,若选择图像灰度直方图中灰度分布的谷底作为阈值,即可对图像进行分割。

阈值分割法可分为全局阈值分割法(Global Thresholding)和局部阈值分割法(localthresholding)。

  • 全局阈值分割法会基于整幅图像的像素统计信息,选取固定的灰度阈值。它适用于每一幅待处理图像中光照都均匀分布,或多幅图像有一致照明的场合;
  • 局部阈值分割法则基于邻域内像素的统计信息,为每个像素计算阈值。它对光线呈倾斜梯度分布或待测目标有阴影的情况特别有效,而在这类情况下全局阈值分割法通常会失效。

1.1、全局阈值分割

全局阈值分割法包括手动阈值分割(manual thresholding)和自动阈值分割
(automatic thresholding)两大类。手动阈值分割方法需要人为确定阈值;自动阈值分割方法基于图像的灰度直方图来确定灰度阈值。

1.1.1、手动阈值分割

手动阈值分割法的阈值选取是关键。若阈值过高,会有过多的目标像素点被误分为背景,阈值选得过低,则会出现相反的情况。

常见的方法有P分法(P-tile)和直方图谷底法。P分法是由Doyle于1962年提出的,该方法根据先验概率来设定阈值,使目标或背景的像素比例等于先验概率。直方图谷底法选取图像直方图各峰之间的谷底作为图像分割阈值。下图显示了基于图像灰度直方图选择单个阈值或多个阈值的例子:

LabVIEW图像分割算法(基础篇—6)

Nl Vision使用IMAQ Threshold实现手动单灰度区间的图像分割。它和其他图像分割函数都位于LabVIEW的视觉与运动→lmage Processing→Processing图像处理函数选板中,如下图所示:

LabVIEW图像分割算法(基础篇—6)

​函数说明及使用可参见帮助手册: 

LabVIEW图像分割算法(基础篇—6)

通过使用单个灰度区间对硬币图像进行分割的示例,了解手动阈值分割实现方法,程序设计思路如下所示:

  • 程序一开始先将原图coins.jpg读入内存,并使用图像显示控件显示;
  • 此后,程序使用IMAQ GetlmageSize获取图像的尺寸,并为图像处理分配缓冲,以方便图像分割算法使用;
  • 以上准备工作完成后,程序便进入实现图像阈值分割功能的While循环;
  • While循环中代表阈值分割方法的变量Type、代表局部分割方法配置参数的变量Local、代表自动阈值分割方法配置参数的变量Automatic、代表手动阈值分割方法配置参数的变量Manual以及代表聚类分割方法配置参数的变量Number of Class被捆绑为簇,经由寄存器与其前一次的值进行比较;
  • 若簇中任一参数发生变化,或者当循环执行第一步时,条件结构True分支中的图像分割代码就会被执行;
  • 具体执行何种图像分割代码,由Type参数控制。Type参数对应于前面板上的Tab控件,当用户选择Manual选项卡时,程序就执行Manual分支中的IMAQ Threshold,完成对图像的人工分割;
  • 默认情况下IMAQ Threshold使用1替换所有指定灰度范围内的像素值,用0替换所有灰度范围外的像素值,以生成二值图像。也可通过设置参数,使灰度区间内的像素保持原值不变,而只把灰度范围之外的背景像素值更改为0;
  • 当用户在前面板上更改了任何与手动分割相关的参数时,While循环将更新图像分割的结果。

程序设计如下所示:

LabVIEW图像分割算法(基础篇—6)

程序效果如下所示:

LabVIEW图像分割算法(基础篇—6)

手动阈值分割方法需要人为确定阈值。由于所选定的阈值不仅作用于整幅图像,还作用于所有使用该方法处理的图像,因此它适用于可采集单幅光照分布比较均匀的图像,且能获取多幅图像之间光照相对一致的机器视觉系统。为了能消除人工设定阈值的主观性,使机器视觉系统能适应不同图像间照明不一致的情况,需要研究各种自动阈值分割方法。

项目资源下载请参见:LabVIEW图像全局阈值分割-嵌入式文档类资源-CSDN下载

1.1.2、自动阈值分割

自动阈值分割方法基于图像的灰度直方图来确定灰度阈值。由于这类算法会基于每幅图像的直方图来计算适合该图像的分割阈值,因此即使机器视觉系统采集的各个图像之间有不同的光照,它们也能正常工作。

Nl Vision支持5种自动阈值分割方法,包括:聚类法(Clustering)、最大类间方差法(Inter-Class Variance)、最大嫡法(Entropy) 、均匀性度量法(Metric)和矩保持法(Moments Preserving)。

其中聚类法是唯一支持将图像分割为两类以上像素点的分割方法,其余4种方法都是针对较为严格的二值分割情况而设计的。

聚类法是一种按照图像像素灰度特征的接近程度分割成多个类的迭代分割方法。常见的聚类算法有K均值(K-Mean)和模糊C均值(FuzzyCMean)算法。

K均值算法是MacQueen于1967年提出的一种解决聚类问题的经典算法。它先任选K个初始值,将它们作为类中心,并根据这些值将其余像素分别归入离它最近的类中。此后再计算新类的均值重新作为新类的中心,并迭代执行前面的分类步骤,直到新旧类均值之差小于某阈值或完全相同为止。其基本算法如下:

1、从样本集中任意选择K个对象作为初始聚类中心;
2、对于剩余样本,根据它们与这些聚类中心的距离(绝对偏差或欧氏距离),将它们分配到与其最近的类(由聚类中心代表);
3、计算每个新类中像素的均值作为新的聚类中心;
4、重复第2和3步,直至相应的新旧类聚类中心之差小于某一阈值或完全相同为止。

K均值算法假定每个样本只能属于某一类,而且若用于图像分割,在图像中的某一类或几类像素较少时,它很难保留像素较多的类别中的图像细节。

模糊C均值算法是在模糊数学基础上对K均值算法的推广,它通过最优化一个模糊目标函数实现聚类。模糊C均值算法不像K均值算法那样认为每个点只能属于某一类,而是计算每个点对各类的隶属度,用隶属度更好地描述边缘像素亦此亦彼的特点。因此,模糊C均值算法较适合图像中存在不确定性和模糊性的情况。

若仅仅要将图像分为目标和背景两类,可以使用迭代法对像素进行聚类,其算法如下:

1、选择一个初始阈值T(通常取图像的平均灰度);
2、用T将像素分割为灰度小于T的G1和大于T的G2两类,并计算G1和G2类中像素的平均灰度值m1和m2;
3、重新设定阈值T=(m1+m2)/2。
4、重复步骤2和3,直到连续迭代中的T值之差小于某一阈值或完全相同为止。

Nl Vision使用IMAQ AutoBThreshold和IMAQ AutoMThreshold实现迭代法和多个目标的聚类分割法。这两个VI位于LabVIEW的视觉与运动→lmage Processing→Processing图像处理函数选板中,见博文1.1.1、手动阈值分割内容部分所示。

通过一个案例,了解使用IMAQ AutoBThreshold实现自动迭代聚类法的方法。

在程序中使用时,只需根据情况通过参数Method选择需要的方法即可,程序设计可见1.1.1、手动阈值分割内容部分所示。

使用迭代聚类法自动将图像coins.jpg分割为目标和背景图像的实例。程序继续沿用了1.1.1、手动阈值分割中实例的结构,运行时选择自动阈值分类选项卡Automatic中的迭代聚类法Cluster并设置目标类型Object Type为亮背景中的暗目标。观察程序运行结果可发现,目标与背景被清晰地分割开来,如下所示:

LabVIEW图像分割算法(基础篇—6)

项目资源下载请参见:​​​​​​​LabVIEW图像全局阈值分割-嵌入式文档类资源-CSDN下载

1.2、局部阈值分割

局部阈值分割法(Local Thresholding)又称为局部自适应阈值分割法 (LocallyAdaptive Thresholding)或可变阈值处理。它在像素的某一邻域内以一个或多个指定像素的特性(如灰度范围、方差、均值或标准差)为图像中的每一点计算阈值。由于要遍历所有图像中的像素,因此邻域的大小对该算法的执行速度会有较大影响。一般来说,邻域的尺寸略大于要分割的最小目标即可。

全局阈值分割法的一个缺点是其在图像和背景灰度差异较明显时容易忽略细节。Niblack二值化算法用于解决此类问题,这种算法的基本思想是对每一个像素点f(i,j),计算其邻域内像素点的均值m (i,j)和方差\delta2(i, j),然后根据以下逻辑对图像进行分割:

1、每个像素计算T(i, j) =m (i, j) +k \delta2 (i, j),其中k为偏差系数(deviationfactor),通常取0.2;

2、若f (i, j) > T (i, j) ,则将该像素归为目标,否则归为背景。

Nl Vision使用IMAQ LocalThreshold实现局部阈值分割法,它位于LabVIEW的视觉与运动→lmage Processing→Processing图像处理函数选板中,见博文1.1.1、手动阈值分割内容部分所示。

IMAQ LocalThreshold为了增强算法的实时性和鲁棒性,提供了两种优化算法:一是使用最大类间方差法的背景纠正法,另一种是Niblack二值化算法(Niblack Algorithm)。

通过一个案例,了解使用Niblack二值化算法对图像进行分割的方法。

程序设计可见1.1.1、手动阈值分割内容部分所示,运行时选择局部阈值分割选项卡local中的Niblack算法,并设置目标类型Object Type为亮背景中的暗目标。Niblack算法的偏离参数被设置为1,窗口大小被设置为64×64(略大于字符)。

观察程序运行结果可以发现,虽然图像的亮度分布不均(中间部分的亮度高于周围亮度),但是局部阈值分割算法也能较好地对图像进行分割,效果如下所示:

LabVIEW图像分割算法(基础篇—6)

项目资源下载请参见:​​​​​​​LabVIEW图像全局阈值分割-嵌入式文档类资源-CSDN下载

1.3、阈值分割算法比较

在使用这些图像分割方法时,常遇到背景和目标之间分界不清的问题。这种情况下,可以先对图像进行预处理,再进行分割。常用的预处理方法包括灰度变换(LUT)、直方图均衡、空域或频域滤波等。使用线灰度工具观察一条跨边缘的线段上的灰度分布,也有助于选择合适的阈值。此外,形态学处理可以对分割后的二值图像进行纠正,以滤除阈值分割过程的错误选择。

下表对上述各种灰度阈值方法进行了汇总和比较。

LabVIEW图像分割算法(基础篇—6)
几种阈值分割方法比较
LabVIEW图像分割算法(基础篇—6)
全局自动阈值分割的几种方法的比较

若要对彩色图像进行阈值化,必须对各个颜色分量设置阈值。只有各颜色分量都满足阈值条件的像素点才能被置为1,否则被置为0。

例如,若要对RGB彩色图像进行阈值化,可以确定要分析目标的红绿蓝各颜色分量的范围,然后再为各颜色分量指定阈值范围。HSL彩色图像的分割很有特点,由于亮度分量(Luminance)代表图像的灰度,色度(Hue)包含图像的主要颜色信息,而Saturation分量代表颜色的饱和度,因此可以选择包含所有亮度值的阈值范围,使图像分割独立于图像的灰度信息,而仅仅根据需要选择不同的色度和饱和度阈值区间即可。

NI Vision使用IMAQ ColorThreshold实现彩色图像的阈值分割,它位于LabVIEW的视觉与运动→lmage Processing→Color Processing彩色图像处理函数选板中,如下所示:

LabVIEW图像分割算法(基础篇—6)

​函数说明及使用可参见帮助手册: 

LabVIEW图像分割算法(基础篇—6)

2、图像边缘分割

图像中目标的边缘是一组相连的像素,它是图像中目标的基本特征之一。这些像素位于灰度不连续(间断或跳变)的两个区域的边界上。由于各种噪声的影响,机器视觉系统采集到的图像中,目标边缘处像素的灰度变化并不都是理想的阶跃式跳变,而通常遵循渐进的变化方式。因此,可以用下图所示的模型来表示图像中目标的边缘。

LabVIEW图像分割算法(基础篇—6)
边缘的模型

边缘模型中常用的参数包括边缘强度(edge strength)、边缘长度(edge length)、边缘位置(edge location)和边缘极性(edge polarity),具体所示如下所示:

  • 边缘强度又称为边缘对比度,指可识别边缘相对于背景的最小灰度差异。边缘强度的大小因光照条件和目标的灰度特性不同而异。若整个场景中光照较弱,则边缘强度较低。若图像中某一目标相对于其他目标亮度很高,则较低亮度目标的边缘强度会被压低。
  • 边缘长度是指能确保所设定边缘强度出现的距离,它由边缘像素灰度的变化率决定。灰度变化较缓慢的边缘,其边缘长度应较大。
  • 边缘位置是指代表边缘的像素在图像中的位置坐标。
  • 边缘极性代表边缘为上升沿还是下降沿,它通常用于指明搜索算法的方向。当边缘处的灰度为递增变化时,其极性为正,反之为负。

边缘分割法基于目标的边缘特征,先使用边缘检测算法检测图像中目标的边缘(如点、线、目标轮廓等),然后再利用像素点的空间关系,根据设定的条件将边缘连接为检测目标的封闭轮廓(contour)。得到的目标轮廓可作为各区域的边界,用于图像分割。

从算法实现的角度来看,可以基于提取到的目标轮廓点构建ROI数据结构,再将ROI转化为遮罩图像。此后,对遮罩图像进行填充,再与图像进行遮罩运算,即可轻而易举地将图像划分为不同区域。下图显示了使用点、线及目标边缘将图像分割为不同区域的示意图。

LabVIEW图像分割算法(基础篇—6)

边缘检测算法主要是对图像灰度变化进行度量,提取图像中不连续的灰度特征,以此定位边缘点。现有的图像处理书籍和资料中多数用相当多的篇幅介绍边缘检测和图像分割。然而若考虑实时性和鲁棒性,这些算法并不见得都适用于机器视觉系统。

2.1、点检测

传统的点检测技术常基于以下模板(以3×3模板为例,但不失一般性)运算进行判别∶

LabVIEW图像分割算法(基础篇—6)

如果设定一个非负的灰度阈值T,并从图像(或ROI)的左上角开始逐点从左到右、从上到下进行扫描,且对于每个像素,都以其为模板中心进行模板运算,则结果超出门限时,即可认为检测到一个孤立点,亦即有下式成立∶

LabVIEW图像分割算法(基础篇—6)

传统点检测方法认为图像中孤立点与其邻域内像素的灰度(即背景)有较大差异,因此通常使用系数之和为0的模板运算获得中心像素的灰度变化,并根据该变化和阈值T来决定是否为孤立点。

LabVIEW图像分割算法(基础篇—6)

虽然传统点检测方法对孤立点的检测较为有效,但它不能判断检测到的孤立点是否边缘点。此外,由于传统点检测方法计算量大,实时性较差,因此有必要寻找更适合机器视觉系统的方法。

本文讲解一种常用的点检测方法,通过限定搜索区域和搜索数量来提高检测的实时性。这种方法最简单直接的应用就是基于一维像素序列上的灰度变化,沿指定方向寻找上升边缘和下降边缘,来进行各种判断。而一维像素序列可基于图像中的任意路径获得,如线段、矩形、旋转矩形、同心圆弧、椭圆、多边形或任意形状。

下图显示了这种从像素序列一端开始搜索上升和下降边缘的简易方法。对于每个像素点,它都会通过比较该点的像素灰度与边缘阈值来判断其是否为边缘点。为了尽可能消除噪声干扰,在判定上升和下降边缘时,可在理想阈值的基础上设定一个裕量(hysteresis),当搜索到第一个大于或等于“理想阈值加上裕量”的像素时,就将该点指定为沿该线搜索到的上升边缘。紧接着,该方法将继续向前寻找第一个小于或等于“理想阈值减去裕量”的像素,找到时就将该点指定为下降边缘。如此循环往复,直到找到所有上升和下降边缘为止。

LabVIEW图像分割算法(基础篇—6)
上升和下降边缘的检测

在实际工作中,由于图像中的目标可能为暗目标,因此找到的第一个边缘点也可能为下降边缘。此种情况下,找到第一个边缘以后的搜索方法与上述过程类似。

多数情况下,基于图像自身的像素分辨率找到的边缘点位置就能满足各种机器视觉检测的需求。但是在某些特殊情况下,由于传感器尺寸或成本方面的限制,即使机器视觉系统的镜头与相机传感器匹配且光照条件较好,采集到的图像也很难满足对最小分辨率的需求。这种情况下,可以使用亚像素(subpixel)边缘定位法来寻找满足系统分辨率要求的边缘点位置。

亚像素是当物理上已经无法在相邻像素间增加更多像素时,使用各种线性、抛物线或多次插值算法,在相邻像素之间插入多个“虚拟像素”以提高测量精度的手段。通常情况下,亚像素边缘点存在于图像中逐渐发生过渡变化的区域,可以利用多项式插值等多种方法获得边缘点的亚像素位置,以提高边缘点检测的精度。例如,可按照以下流程使用抛物线插值法(parabolic interpolation)进行亚像素边缘定位,如下所示:

LabVIEW图像分割算法(基础篇—6)

1、基于图像像素沿某一线段寻找边缘点;
2、选择检测到的边缘像素点(xo,yo)及与其左右相邻的两个点(x-1,y-1)和(x1,y1)作为抛物线插值的3个点;
3、根据已知的3个点计算抛物线方程y=ax2+bx+c的系数a和b;
4、由于抛物线方程在x=-b*2a处有极值,因此可选择该处为相对于最近像素点的亚像素边缘。

虽然基于亚像素定位法可以提高测量精度,但是由于计算量增加,程序的实时性也会相对降低。因此在实际中总是需要在速度与精度之间进行取舍。

NI Vision使用位于LabVIEW的视觉与运动→Machine Vision→Caliper函数选板中的IMAQ SimpleEdge实现上述沿一维像素序列检测边缘点的方法,如下所示:

LabVIEW图像分割算法(基础篇—6)

​函数说明及使用可参见帮助手册: 

LabVIEW图像分割算法(基础篇—6)

通过使用IMAQ Simple Edge检测零部件边缘点的实例,了解其使用方法,程序设计思路如下所示:

  • 程序开始先为图像处理分配内存并指定了一条线段作为图像的初始ROI;
  • 程序在执行第一个循环时,先由IMAQ Clear Overlap清除图像中的叠加图层,然后由IMAQ ROIProfile返回初始ROI所覆盖的一维像素序列,并绘制该ROI上的像素灰度变化曲线;
  • IMAQ Simple Edge可以基于事先设置的边缘灰度阈值和抗噪裕量,返回像素序列中的边缘点数量和位置。必要时也可以通过设置亚像素精度参数Sub-Pixel Accuracy为True来提高算法的检测精度;
  • Overlay Points with User Specified Size.vi可以按照检测到的边缘位置,以指定的颜色和尺寸在图像中标记出它们的位置;
  • 当循环继续执行时,程序将检查控制算法执行的参数Process或Threshold Parameters簇是否被改变,或者图像控件中是否有ROl绘制事件发生;
  • 当任何一个变化发生时,分支结构中的代码将被再次执行;
  • 程序直到用户单击Stop按钮退出并释放内存为止。

程序设计如下所示:

LabVIEW图像分割算法(基础篇—6)

程序还显示了用户绘制矩形ROI时,程序检测所有该矩形ROI上的边缘点的情况,注意,在此过程中用户设置了相对阈值方式来检测边缘,效果如下所示:

项目资源下载请参见:LabVIEW机器视觉检测零部件边缘点-嵌入式文档类资源-CSDN下载

2.2、线检测

传统的线边缘检测技术常基于以下各种方向模板运算进行判别:

LabVIEW图像分割算法(基础篇—6)

本文提出一种适合机器视觉系统的直线检测方法,思路如下所示:

1、将搜索路径从一维扩展至二维。不是沿某一条搜索路径搜索边缘,而是沿图像中多条搜索路径进行边缘检测;
2、基于检测到的边缘点,使用曲线拟合的方法确定目标边缘。

理论上来讲,该方法适合任意形式的搜索路径和可能拟合的曲线。然而,无论对于搜索路径还是最终需要拟合的边缘线来说,直线、圆(圆弧)和椭圆最为实用,因此以下将主要介绍基于这几种路径的方法。

沿矩形ROI区域内多条直线搜索边缘点的矩形耙(Rectangle Rake)是最常用的工具之一。矩形耙工具因其形状像耙子而得名,如下图所示。矩形耙基于矩形ROI内部平行于矩形ROI的多条线搜索边缘点。对于水平放置的或旋转过的水平矩形ROI,可以沿这些线从左到右或从右到左进行搜索。如果需要从上到下或从下到上搜索边缘,则可使用垂直放置或旋转过的垂直矩形ROI。与一维边缘点检测方法类似,矩形耙可以搜索各条搜索线上的上升边缘、下降边缘、首尾或所有边缘点,以及边缘强度最大的最佳边缘点。

LabVIEW图像分割算法(基础篇—6)
矩形耙

同心耙(Concentric Rake)与矩形耙工作原理类似,它基于圆形或同心圆弧ROI区域内的多条线进行搜索,这些线与圆或圆弧同心。使用同心耙搜索时,既可沿顺时针方向搜索,也可沿逆时针方向搜索。如下所示:

LabVIEW图像分割算法(基础篇—6)
同心耙

轮辐(Spoke)工具因其形状酷似自行车的轮辐而得名,它也基于圆形或同心圆弧ROI区域进行搜索,但与同心耙工具不同,其搜索线是一组从圆心到外边缘的辐射状线条。使用轮辐工具时,既可从圆心向外搜索,也可从外部向圆心方向搜索。如下所示:

LabVIEW图像分割算法(基础篇—6)
轮辐搜索

Nl Vision使用位于LabVIEW的视觉与运动→Machine Vision→Caliper函数选板中的IMAQ Rake 3、IMAQ Concentric Rake 3和IMAQ Spoke 4实现矩形耙、同心耙和轮辐边缘点检测算法,如下图所示:

LabVIEW图像分割算法(基础篇—6)

​函数说明及使用可参见帮助手册: 

LabVIEW图像分割算法(基础篇—6)

Nl Vision使用位于LabVIEW的视觉与运动→Machine Vision→Analytic Geometry解析几何函数选板中的IMAQ Fit Line、IMAQ Fit Circle 2和IMAQ FitEllipse 2实现基于离散特征数据点的直线、圆或椭圆的拟合,如下图所示。这些VI所使用的曲线拟合算法是在传统曲线拟合方法的基础上进行优化后得到的。

LabVIEW图像分割算法(基础篇—6)

​函数说明及使用可参见帮助手册: 

LabVIEW图像分割算法(基础篇—6)

工业中常需要对“喷雾”的角度进行测量,例如在生产汽车喷油嘴时,就可以通过检测其喷雾的角度来判断产品的质量。当喷油嘴无喷雾或喷雾的边缘夹角达不到某个指定的角度时,即可认为产品不合格。为了计算喷雾角度,需要先找到喷雾的两条边缘线。为此,可以先使用矩形耙或同心耙,获得喷雾两个边缘上的两组边缘点,再使用直线拟合得到两条边缘线。

通过使用同心耙和直线拟合检测工业喷雾装置边缘的实例,了解其使用方法,程序设计思路如下所示:

  • 程序将轮询的输入量全部捆绑成簇,一开始先进行一系列准备工作,包括读入图像,为图像处理分配内存以及创建一个起始角度为180°,终止角为360°同心圆弧形的ROI;
  • 随后,程序清除图像中的叠加图层,并使用同心耙函数IMAQ Concentric Rake 3沿逆时针方向(Search Direction的值为0)检测各条线上的首尾边缘点。步长Step Size被设置为3个像素,这意味着同心耙中每隔3个像素就有一个用于搜索边缘的同心圆弧;
  • 检测到的边缘点由Sub-OverlayPointswithSpecified Zize.vi以红色在图像上标记了出来;
  • 最后程序在使用IMAQ Fit Line分别将检测到的两组边缘点拟合成两条直线后,用IMAQ
  • Overlay Line以黄色显示在图像上。

程序设计如下所示:

LabVIEW图像分割算法(基础篇—6)

程序还允许人工在图像中绘制矩形耙或同心耙或调整各类参数,以观察直线检测的效果,效果如下所示:

一旦获得两条喷雾的边缘线,就能很容易通过以下方法计算喷雾的夹角。值得一提的是,NI Vision为图像夹角测量提供了专门的函数,开发人员无须关注这些计算细节就能直接获得稳定的测量结果。

LabVIEW图像分割算法(基础篇—6)
计算平面上两条直线的夹角

项目资源下载请参见:LabVIEW工业喷雾装置边缘检测-嵌入式文档类资源-CSDN下载

2.3、轮廓提取

轮廓(contour)是指可以在图像中勾勒出目标外形(shape)的一组相互连接的曲线(curve)。这些曲线由一系列目标物的边缘点组成。由曲线构成的轮廓,通常会勾勒出被测目标的外形。因此,基于目标的轮廓可以轻而易举地实现图像分割。

在Nl Vision中,为了基于目标物的轮廓对图像进行分割,可以先将提取到的轮廓信息转换为ROI,再由ROI获得遮罩图像,此后经图像的遮罩运算即可将图像划分为不同区域。下图显示了基于目标轮廓的图像分割过程。

LabVIEW图像分割算法(基础篇—6)
基于目标轮廓的图像分割过程

目标的轮廓提取可分为搜索曲线种子(Search Curve Seed)、追踪曲线(Tracingcurve)、曲线连接(Curve Connection)和轮廓选择(Contour Selection)几个步骤。

其中搜索曲线种子和追踪曲线的过程又统称为曲线提取(curve Extraction)过程。曲线的种子点(Seed Point)是曲线追踪过程的起始点,合格的曲线种子点应满足两个条件,一是其边缘强度应大于设定的阈值,二是它不能属于已知曲线上的像素点。若用Pi,代表(i,j)处像素的灰度,则(i,j)处的边缘强度Ci,可由以下公式计算:

LabVIEW图像分割算法(基础篇—6)

Nl Vision使用IMAQ Extract Contour封装了包括搜索曲线种子、追踪曲线、曲线连接和轮廓选择几个步骤在内的所有目标轮廓提取过程,它位于LabVIEW的视觉与运动→Machine Vision→Contour Analysis函数选板中

LabVIEW图像分割算法(基础篇—6)

​函数说明及使用可参见帮助手册: 

LabVIEW图像分割算法(基础篇—6)

IMAQ Extract Contour可工作在常规模式(Normal)或均匀模式(Uniform Regions)两种模式下。当其工作在均匀模式下时,VI会假设图像中目标区域和背景区域的像素值分别为一致的灰度值,这有助于提高VI的执行效率。

通过使用IMAQ Extract Contour提取零部件工件轮廓的实例,了解其使用方法,程序设计思路如下所示:

  • 程序一开始先将工件图像Clamp.png读入内存,并指定图像中的ROI区域;
  • 进入主循环后,程序监测曲线提取过程的参数及图像显示控件中绘图事件(Draw),一旦有变化,程序就调用IMAQ Extract Contour从ROI中提取目标的轮廓,并由IMAQ Overlay Contour在图像中标记出最终选择的目标轮廓。

程序设计如下所示:

LabVIEW图像分割算法(基础篇—6)

程序还显示了从左到右搜索ROI时所提取到的最接近ROI左侧的目标轮廓图像,效果如下所示:

LabVIEW图像分割算法(基础篇—6)

项目资源下载请参见:项目实战:LabVIEW提取零部件工件轮廓-嵌入式文档类资源-CSDN下载

机器视觉系统基于分割后的图像信息来提取检测目标的特征,因而图像分割的质量直接决定机器能否快速准确地基于目标特征进行决策。阈值分割和边缘分割可以满足大多数机器视觉应用的要求,但是当所采集的图像质量较差,目标和背景的灰度差别不大或视场中被测目标有交叠时,其分割效果并不理想。在这种情况下就需要使用图像的区域分割法和形态学(Morphology)分割法。

3、图像形态学分割

形态学是用来研究生物形态结构和功能结构的学科,包括生物体的外观、结构、图案以及生物体的骨骼、器官内部功能结构等。它最早由歌德在其生物学研究中倡导,强调把生命形式当作有机的系统看待,反对只注重对生物体器官的分析。

图像的数学形态学处理既可作用于经阈值化处理得到的二值图像,也可用于处理灰度图像。灰度图像的形态学处理主要通过将像素灰度值变更为其邻域内像素的灰度最大或最小值来实现灰度图像的增强,包括降噪、背景矫正和平滑渐变的灰度特征等。它也可以通过扩展或收缩目标的亮度区域来改变目标的形状,增强目标边界的对比度。二值图像的形态学处理则主要用来去除经阈值化处理得到的二值图像中不需要的信息,如噪声相互重叠的目标边界等。当然,它也可以扩展或收缩目标边界来改变其形状。

图像的数学形态学处理包含多种计算形式,其中腐蚀(Erosion)、膨胀(Dilation)和击中—击不中(Hit-Miss)是3种最基本的形态学运算形式。通过对它们进行组合,可以进一步获得更多其他组合形式的运算,如开运算(Opening)和闭运算(Closing)、内形态梯度(Inner Gradient)和外形态梯度(Outer Gradient)运算、细化(Thinning)和加粗(Thickening)运算,适当开(Proper-Opening)和适当闭(Proper-Closing)运算以及自动中值(Auto-median)运算等。图像形态学处理运算汇总如下图所示:

LabVIEW图像分割算法(基础篇—6)

3.1、像素的形态学处理

图像的形态学处理常表现为一种像素的邻域运算形式,它使用具有一定形态的结构元素与图像进行形态学运算,并进而研究图像各部分的关系,以寻求各种问题的解决方案。运算过程中,以下因素直接决定形态学处理的结果:

1、结构元素的尺寸(Structure Element Size);

2、结构元素的数值(Structure Element Value);

3、待处理图像的像素边框形状(Pixel Frame Shape);

4、形态学处理算法的类型。

其中,前3项直接决定哪些像素将参与形态学处理运算,而形态学算法的类型则决定了如何基于选定的像素进行邻域计算。

结构元素的尺寸和数值对形态学处理的影响如下图所示。结构元素通常为行、列数相同的奇数矩阵形式,它将中心元素与图像中待处理的像素对齐,依据其尺寸的大小在待处理像素邻域内划定了形态学运算的范围。也就是说,运算时仅考虑被结构元素覆盖的图像像素。程序开发过程中,结构元素可以用二维数组描述,常见的尺寸有3×3、5×5和7×7等几种。若指定的数组行、列数不同,则程序应能自动截取最接近的奇数矩阵。结构元素的尺寸越大,形态学处理的计算量就越大,相应的处理速度就越低。

LabVIEW图像分割算法(基础篇—6)

形态学处理的算法决定了使用何种方法基于所选出的像素获得结构元素中心所覆盖像素的新值。

腐蚀、膨胀和击中—击不中是3种最基本的形态学算法。若用Po代表中心像素,用Pi代表基于像素边框和结构元素选出的像素,则3种算法的计算方法、用途及适用的图像类型如下表所示:

LabVIEW图像分割算法(基础篇—6)

腐蚀和膨胀运算既可作用于灰度图像,也可作用于二值图像,但因图像类型不同,其作用也有差异。二值腐蚀运算常用来消除图像中相对背景亮度较高的孤立像素点,或根据所选结构元素特征,细化目标的轮廓。

计算时,仅当所有Pi值均为1时,二值腐蚀运算才将Po的值置为1。也就是说,若有任一个Pi值为0,二值腐蚀运算就将Po的值置为0。二值膨胀运算则常用于消除图像中孤立于颗粒内部的孔洞(即被灰度较高的像素所包围的区域),或根据所选结构元素特征扩展目标的轮廓。

计算时,若有任一个Pi值为1,二值膨胀运算就将Po的值置为1。从逻辑运算的角度来看,二值腐蚀相当于对Pi求与运算,二值膨胀相当于对Pi求或运算。若将它们作用于同一图像,二值膨胀运算则等效于对图像的背景进行二值腐蚀运算,因此它与二值腐蚀运算的效果刚好相反。

Nl Vision将上述的基本形态学处理算法封装在IMAQ Morphology和IMAQ GrayMorphology中,前者用于二值图像,后者用于灰度图像。它们位于LabVIEW的视觉与运动→Image Processing→Morphology函数选板中,如下图所示:

LabVIEW图像分割算法(基础篇—6)

​函数说明及使用可参见帮助手册: 

LabVIEW图像分割算法(基础篇—6)

通过使用IMAQ Morphology对电路板图像进行连续两次腐蚀操作,滤除图像中间部位斑点噪声的实例,了解其使用方法,程序设计思路如下:

  • 程序在为图像处理分配内存后,先对读入的灰度图像进行了自动阈值化处理,然后进入主循环;
  • 主循环监测任何与形态学处理相关的参数变化,若用户更改任一参数,则分支结构中的IMAQ Morphology就会被执行,并将形态学处理的结果显示在图像显示控件中。

程序设计如下所示:

LabVIEW图像分割算法(基础篇—6)

由于处理结果为二值图像,因此应通过图像显示控件的右键菜单将其显示调色板设置为Binary以获取最佳显示效果,如下所示:

LabVIEW图像分割算法(基础篇—6)

 项目资源下载请参见:​​​​​​​LabVIEW电路板图像腐蚀操作-嵌入式文档类资源-CSDN下载

3.2、颗粒的形态学处理

颗粒是指图像中相互连通的一组非0或灰度较高的像素所构成的区域。判断一个像素是否属于某一颗粒,要看它是否与该颗粒之间具有连通性(Connectivity)。例如,填充区域中的孔洞、移除与图像边界粘连的区域、滤除不需要的区域、分离重叠区域、搜索区域中的凸壳(Convex Hull)等。经过这些算法处理后的图像更适于进行基于颗粒的定量分析、提取目标的简易模型或进行目标识别。

数字图像中与像素邻接(Adjoining)的像素有8个,但是判断邻接的像素是否属于同一颗粒,就要依据某种连通性判断准则。

常见的连通性判断准则有4连通(Connectivity-4)和8连通(Connectivity-8)两种。

  • 4连通准则认为,若像素在水平或垂直方向上与另一像素邻接,则这两像素属于同一颗粒;
  • 8连通准则的判断条件则相对宽松,只要像素在水平、垂直或对角线方向上与另像素邻接,则就认为它们属于同一颗粒。

若像素与其水平或垂直方向上邻接像素的距离为D,则4连通认为像素与距其为D的邻接像素属于同一颗粒,而8连通则认为距离像素为D或\sqrt{2}D的像素与其属于同一颗粒。下图显示了4连通和8连通的结构,以及分别使用它们对同一图像中的像素进行判断时所得到的不同结果。

LabVIEW图像分割算法(基础篇—6)

确定了连通性判断准则,就可以将二值图像中每个连通区域标记(Label)为能被独立识别的颗粒,以方便图像的分割和处理。

图像标记过程搜索二值图像中相互连通的各组像素(即颗粒),并将属于同一颗粒的像素值全部更改为某一固定的标记值,将二值图像的背景标记为0。考虑标记值等效于像素的灰度,可以使用8位或16位对标记值编码,这样就能直接将标记后的图像作为8位或16位灰度图像进行保存。

由此可知,图像标记过程的输入图像为二值图像,但其输出却是含有为每个颗粒都设置灰度标记值的灰度图像。其中灰度标记值的数量等于图像中颗粒的数量再加上用于背景的灰度标记值0。

图像标记过程要解决的另一问题是根据连通性判断准则寻找能快速确定各个独立颗粒的搜索算法。NI Vision将图像标记过程封装在位于LabVIEW的视觉与运动→lmage Processing→Processing函数选板的IMAQ Label中,如下图所示:

LabVIEW图像分割算法(基础篇—6)

​函数说明及使用可参见帮助手册: 

LabVIEW图像分割算法(基础篇—6)

但是NI的相关文档中并未说明该函数具体使用了何种搜索算法。图像标记最为常见的搜索算法如下:

1、逐行扫描像素,找到第一个非0像素作为种子点,为其设置专门的标记值;

2、从种子点开始按照连通性判断准则沿各个方向搜索与其连通的像素,并将其置为与种子点相同的标记值;
3、以各个连通的像素点为新的起点,沿各个方向搜索与其连通的未标记像素,并将其置为与起点相同的标记值。不断重复该过程,直到所有分支上的像素都被标记为止;
4、重新扫描图像中未被标记的点,将其作为种子点,重复步骤1到步骤3,直到所有像素均被标记为止。

虽然上述搜索算法比较直观,但其效率并不高,因此近几年涌现了大量的快速标记算法。例如,下述基于行程的标记方法就更快一些。

1、从第一行开始扫描图像,把其中连续的由非0像素组成的序列组成一个块,为其按递增的顺序设置标记值;

2、从第二行开始逐行扫描所有行里的块。如果它与前一行中的所有块都没有连通,则给它一个新的标记值;如果它仅与上一行中一个块连通,则将上一行的那个块的标记值赋给它;如果它与上一行两个以上的块有连通,则将当前和块及其相连的块标号均设置为上一行中块的最小标号;

3、重复步骤2,直到所有像素均被标记为止。

通过一个基于标记值从图像中分割出面积最大的标记区域的实际例子,了解其使用,程序设计思路如下:

  • 程序一开始先为源图像和标记图像分配缓冲,然后执行对图像进行标记的LabelGraylmg.vi,它会先使用IMAQ Threshold函数对输入的灰度图像进行阈值化处理;
  • 用IMAQ Morphology对阈值化得到的二值图像进行增强处理,然后再对二值图像中的颗粒进行标记;
  • IMAQ Quantify基于输入的遮罩图像对灰度区域进行统计,由于所分析的图像和遮罩图像均为LabelGraylmg.vi输出的标记图像,因此IMAQ Quantify输出的针对各颗粒的区域报告数组(Region Reports)簇元素中,灰度均值Mean Value就应恰好为各颗粒的标记值;
  • MaxAreaIndex.vi基于Region Reports数组元素簇中的颗粒面积Area (Pixel)字段,寻找所有标记的颗粒中面积最大的一个,并返回其在数组中的索引;
  • 使用该索引,就能从数组中得到面积最大的颗粒所用的标记值,而函数IMAQ LabelToROl就具备将一个或多个标记值(封装在数组中)对应的颗粒转换为ROl的能力。

程序设计如下所示:

LabVIEW图像分割算法(基础篇—6)

效果如下所示:

LabVIEW图像分割算法(基础篇—6)

 项目资源下载请参见:LabVIEW从图像中分割出面积最大的标记区域-嵌入式文档类资源-CSDN下载

4、图像区域分割

区域分割是将图像按照相似性准则分成不同区域的过程,主要包括:基于形态学的分水岭分割法和区域生长、区域分裂合方法等。

分水岭法是基于拓扑理论的数学形态学的分割方法。其基本思想是:把图像中的颗粒看作测地学上的盆地,其中每一像素的灰度值表示该点的深度,每一个局部极小值及其影响区域称为集水盆地(Catchment Basin),而集水盆地的边界则形成分水岭。下图用一个简单的图像来说明分水岭分割法的原理。它首先计算图像的距离场,用像素到颗粒边界的最近距离作为它们的标记值。其次,它将距离场看作地形图,颗粒被看作盆地,而像素的标记值则被看作盆地各处的深度。若在距离场图像中画如图(b)所示的直线,则可得到图(e)所示的地形剖面图。

分水岭算法的实现可通过水淹过程来说明。假定水均匀地对盆地进行填充,则盆地中的最低点(离边界较远的点)首先被淹没,然后水会逐渐填满整个盆地。当水位到达一定高度的时候将会溢出,这时就可以在水溢出的地方划出分水岭。如果用颗粒的标记来模拟对盆地的填充过程,则重复上述过程直到整个图像上的点全部被淹没,这时所划出的一系列分水岭就可以将各个盆地分开,如图 (d)所示。分水岭算法对微弱的边缘有着良好的响应,但图像中的噪声会使分水岭算法产生过度分割的现象。

LabVIEW图像分割算法(基础篇—6)

下图对上述3种基于标记的分割过程进行了汇总。假定待分割的图像为已经过图像增强过程处理后的灰度图像,则先要对该图像进行全局或局部阈值化处理,以获得二值图像。由于经阈值化操作得到的二值图像中常含有噪声颗粒,而且感兴趣的颗粒可能已经被损坏或者被图像边界切断,因此在正式进行分割前,一般先要用形态学处理过程剔除噪声颗粒,对感兴趣的颗粒进行填充并剔除边界颗粒。经过这些修正操作后的二值图像中的颗粒不仅能更真实地代表目标,而且更便于分割。

LabVIEW图像分割算法(基础篇—6)

区域生长是一种古老的图像分割方法,最早的区域生长图像分割方法是由Levine等提出的,其基本思想是将具有相似性质的像素集合起来构成区域。该方法先从图像中选定要分割目标内的一个像素或小块作为种子,再根据某种事先确定的准则,将邻域中与种子区域具有相同或相似性质的像素或区域与种子区域合并,此后继续将最新合并的像素或区域又作为新的种子继续进行合并的过程,直到再没有满足条件的像素能被包括进来为止。这种方式的关键是基于灰度、纹理、颜色等信息,选择合适的初始种子像素或区域和合理的生长准则。T.C.Pong等提出的基于小面(facet)模型的区域生长法是区域生长法的典型代表。

形态学重构(Morphological Reconstruction)可理解为一种有效的区域的生长方法。它基于源图像和一个与源图像大小相同且包含种子区域的标记图像(Marker lmage),对灰度图像或二值图像中的目标进行重构,以实现图像分割。在重构过程中,源图像在功能上相当于遮罩,标记图像用来对重构过程进行记录。重构的起始位置由标记图像中的种子区域或一组源图像中的种子像素来确定。

通过实现分水岭算法,来了解其使用方法,程序设计思路如下所示:

  • 实例一开始先照例读取图像文件,为后续操作分配内存,随后进入主循环;
  • 若主循环中监测的用户界面参数控件有变化,则程序就按照这些参数执行分支结构中的代码;
  • 其中IMAQ Threshold用于对图像进行阈值化获取细胞的二值图像,IMAQ RemoveParticle通过3次腐蚀运算来剔除噪声,IMAQ Convex Hill对颗粒进行填充,而IMAQ RejectBorder则用于剔除边界颗粒;
  • 经过这些优化处理后,二值图像中的颗粒更接近真实的血红细胞,且更便于后续对分支结构中代码所实现的4种算法进行图像分割。

程序设计如下所示:

LabVIEW图像分割算法(基础篇—6)

效果如下所示:

LabVIEW图像分割算法(基础篇—6)

 项目资源下载请参见:​​​​​​​LabVIEW图像区域分割算法-嵌入式文档类资源-CSDN下载

图像分割的质量直接决定机器能否快速准确地进行决策。当所采集的图像质量较差、目标和背景的灰度差别不大或视场中被测目标有交叠时,需要使用图像的形态学分割法和区域分割法来代替阈值分割法和边缘分割法。图像的数学形态学处理通常使用具有一定形态的结构元素与图像进行形态学运算,并进而研究图像各部分的关系,以解决噪声抑制、特征提取、边缘检测、图像分割、形状识别、纹理分析、图像恢复与重建、图像压缩等图像处理问题。它既可作用于经阈值化处理得到的二值图像,也可用于处理灰度图像。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143862.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • DataList事件ItemDataBound与DataBind()

    DataList事件ItemDataBound与DataBind()     学习控件,往往需要知道控件所拥有的事件,比如说DataList控件吧,以前没有用过,但凭着对其它控件(如:Dropdownlist)的认知,想当然就知道只要给数据源绑定数据就OK了。那样控件应该就能显示数据了,虽然这样的想法不无道理,但有时候总有例外,比如Component的combobox,除了要绑定数据源,还要先在绑定前指定文本域名与值域名的属性值,方可显示。查找了MSDN的相关说明如下:地址:http://msdn.microsoft.com/zh-cn/library/system.we

    2022年10月13日
  • java中的工作流要怎样实现_java工作流开发要怎么实现?

    java中的工作流要怎样实现_java工作流开发要怎么实现?Java工作流的应用在目前十分广泛,能够熟练的实现工作流也是一种本事,本篇文章就让小编带你了解下其中的实现关键。我们知道,工作流的实现主要依靠反射机制,想要实现它,首先我们先来创建一张工作流表创建一张工作流表如:主键|工作流Code|工作流内容其中工作流内容为Json格式工作流内容{“procCode”:”OPS”,”procName”:”c端补齐(乘客信息补全)”,”taskCo…

  • python用冒泡法排序_数组冒泡排序c语言函数

    python用冒泡法排序_数组冒泡排序c语言函数arr=[7,4,3,67,34,1,8].defbubble_sort:最近在学习Python,下面是我的一些笔记冒泡排序实现思路:使用双重for循环,内层变量为i,外层为j,在内层循环中不断的比较相邻的两个值(i,i+1)的大小,如果i+1的值大于i的值,交换两者位置,每循环一次,外层的j增加1,等到j等于n-1的时候,结束循环第一次看不懂很正常,不要灰心,下面是使用代码的实现arr=…

    2022年10月16日
  • springboot websocket 跨域_前端websocket框架

    springboot websocket 跨域_前端websocket框架WebSocket是HTML5开始提供的⼀种在单个TCP连接上进⾏全双⼯通讯的协议,可以实现跨域访问。websocket安装命令npmiws-S服务器端:letWebServerSocket=require(“ws”).Server;letwss=newWebServerSocket({port:8200});constmysql=require(“…

  • Java多线程学习(吐血超详细总结)

    Java多线程学习(吐血超详细总结)本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。

  • 嵌入在网站上Flash播放机(2)

    嵌入在网站上Flash播放机(2)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号