查找人类卷发长度和端点的算法

信息处理 图像处理 边缘检测
2022-02-21 12:08:45

我正在尝试对 iPhone 应用程序上的卷发进行一些分析。我一直在使用 openCV 库。

特别是我希望能够估计头发的长度,并找到它的端点(卷曲的衡量标准是拉伸的端到端长度与放松的端到端长度)。

到目前为止,我的方法是使用精巧的边缘检测器来寻找头发。然后扩大结果。最后对图像进行骨架化,并认为末端是那些只有一个邻居的像素。由于生成的图像希望是一个像素粗的线,我可以只计算像素来估计长度(并可能调整对角线运动)。

问题是当头发如此卷曲时,它会自行交叉。这使得骨架化添加了额外的分支和环,从而弄乱了结果。

对于非常卷曲的头发有更好的方法吗?

一些例子: 之前的直发

后直发

之前的卷发

卷发后

卷发放大

1个回答

请注意,一旦获得骨架,就很难反向分离不应该连接的连接组件。

问题是您的原始图像对比度太低。我将对您的原始图像进行开放形态学操作以去除背景,从而增加头发的对比度。

您的原始图像(将每个像素反转255-I):

在此处输入图像描述

背景(使用 20*20 allones 内核进行开放操作,为了去除暗区,连同小而薄的亮区,只保留大亮区,将其视为噪声背景):

在此处输入图像描述

从原始图像中减去背景,然后将输出二值化,您有:

在此处输入图像描述

接下来,我将对内核进行膨胀:

[0 0 1;...
 0 1 0;...
 1 0 0]

移除小的孤立物体,你有:

在此处输入图像描述

最后提取骨架:

在此处输入图像描述

看起来比你的结果更好。

最重要的一步是二值化部分。阈值化后获得的效果越好,实现骨架提取就越容易。而对比度增强是二值化过程中的关键操作。