嗨 CV/模式识别社区,
我有一个关于图像分割的严重问题。场景是炉内的气氛,让我发疯。而且我需要在短时间内(<10 秒)检测不同材料(玻璃、陶瓷、铝、铱、..)的物体轮廓,而不仅仅是一种特殊情况。我还需要代码的连续像素行中的轮廓。因此,还需要链码或所谓的边界/轮廓跟踪,因此开孔并不好。背景中有非线性噪声,大约是灰尘、颗粒或其他,不时出现。
欢迎使用 Matlab 或 OpenCV 建议。
为了更清楚,我发布了我的目标的另一张图像和一个半透明的物体,它也需要被检测到。还有更多需要注意的例子。
正如您在图像#1 中看到的那样,图像的右侧和靠近恒星的外轮廓附近有粒子,这就是物体。整体对比度也不是很好。物体本身位于地下,与轮廓检测无关。图像#2 显示了一个半透明的对象,这也是可能的。
我想找到该对象的轮廓/周长,例如在下一个屏幕(红线)上。两个矩形(黄色)标记起点(左)和终点(右)。蓝线是可以忽略的。
起初我以为只用过滤器就可以解决那种肮脏的气氛的问题。但是在投入大量时间之后,我才意识到,我必须显着消除或减少噪音以增加前景和背景的对比度。我尝试了很多方法,比如直方图均衡、Otsu 自适应均衡、线性滤波器(例如高斯)、非线性滤波器(中值、扩散)、主动轮廓、k-Means、Fuzzy-c-means 以及 Canny for pure边缘检测结合形态算子。
- Canny:粒子和大气造成了孔洞,但我需要物体的完整轮廓。仍然对形态算子进行闭合、膨胀还不够好。由于滞后,Canny 仍然是我研究过的所有方法中最好的结果。
- 活动轮廓:它们也适用于边缘/渐变,它们在对象内部初始化后表现得非常疯狂,这可能是由导致“开放”对象的边缘映射引起的。据我所知,轮廓必须关闭。尝试了不同的衍生产品(GVF/VFC/Classic Snake)。
- k-均值:结果包括炉内气氛,因为背景有雾。模糊 c 均值也是如此。我选择了两个集群,因为将对象与背景分开。更多的集群导致更弱的结果。
- 直方图/Otsu:由于非常接近的灰色强度(恕我直言!),它将对象与背景合并。尝试使用本地和全局方法。
- 过滤器:特别是 GLPF 或其他 LPF 会涂抹边缘,效果不太好,甚至无法减少雾气。
- 非线性滤波器保留边缘。他们中的大多数人在计算大图像时花费的时间太长。现在采取了快速双边过滤器。结果见下文。
因此,对于后处理步骤来说,没有一种方法足够好,因为对象片段的获得结果与现有算法的竞争很差。现有算法非常本地化,因此适用于这种非常特殊的场景。
所以我问你,如果我完全错过了什么......我不知道如何处理以及我应该如何获得良好的轮廓结果,没有间隙或孔......是否有可能不对CCD和物理环境?提前致谢!
到目前为止的最后一种方法(经过一夜的 MO 实验):
- 双边过滤器(边缘保留,但平滑同质区域)
- Canny(西格玛 = 2,阈值 = [0.04 0.08])
- 形态运算 (MO):
bwareopen
,closing
,remove
&bridge
bwlabel
仅选择轮廓的周边,从而消除不需要的噪声。还没有更新的截图,但它适用于明星。玻璃有一个连接到外轮廓的内轮廓,这也可以在下面的屏幕截图中看到。
所以恐怕我需要一个特殊的算法来遍历外轮廓。这将是邻域的一些顺时针/逆时针查找。如果有角点,顺时针/逆时针步骤可以切换。如果有间隙,请增加半径并再次查看。如果有两个或多个可能的以下点,则取与前一个方向相同的点。你认为,轮廓跟随算法有意义吗?