嗨,CV /模式识别社区,

我在图像分割方面遇到了严重的问题。
场景是炉子中的气氛,使我的脑袋发疯。
/>不仅需要针对一种特殊情况,还需要在短时间内(<10秒)检测不同材料(玻璃,陶瓷,Al,Ir ...)的物体轮廓。
我还需要代码的连续像素行中的轮廓。因此,还需要使用链码或所谓的边界/轮廓跟随,以免出现空洞。
在背景中会出现非线性噪声,大约是灰尘,颗粒或其他一些东西,有时会出现时间。

欢迎使用Matlab或OpenCV建议。

为了更清晰起见,我发布了另一幅关于目标和半透明对象的图像,这也需要被检测到。另外还有一些需要注意的例子。


如图像#1所示,图像的右侧和外部附近有粒子。物体的恒星轮廓。
整体对比度也不是很好。
物体本身位于地下,与轮廓检测无关。
图像#2显示了一个半透明的对象,这也是可能的。

我想找到该对象的轮廓/周长,就像在下一个屏幕(红线)上一样。
两个矩形(黄色) )标记起点(左)和终点(右)。
蓝线是可忽略的。


起初我以为我可以解决问题只是过滤器的那种肮脏的气氛。但是经过一段光荣的投入时间,我才意识到,为了提高前景和背景的对比度,我必须显着消除或减少噪音。
我尝试了很多方法,例如直方图均衡,自适应Otsu均衡,线性滤波器(例如高斯),非线性滤波器(中值,扩散),活动轮廓,k均值,Fuzzy-c-means以及纯Canny边缘检测结合形态学运算符。


Canny:粒子和大气层正在引起空穴,但是我需要对象的完整轮廓。仍以形态算子的闭合,扩张还不够。由于滞后现象,Canny仍然是我研究过的所有方法中最好的结果。
主动轮廓:它们也可以在边缘/渐变上起作用,
它们在对象内部初始化后表现得非常疯狂。由边缘贴图导致的“打开”对象引起的。据我所知,轮廓必须封闭。
使用不同的导数(GVF / VFC /经典蛇)对其进行了尝试。
k均值:由于背景模糊,结果包括炉内气氛。对于模糊C均值也是如此。由于将对象与背景分离,因此选择了两个群集。簇越多,结果越弱。
直方图/大津市:由于灰度强度非常接近(imho!),因此会将对象与背景合并。
滤镜:尤其是GLPF或其他LPF会在边缘上涂抹污渍,这不太好,甚至都无法减少有雾的气氛。
非线性滤镜可以保留边缘。它们中的大多数对于计算大图像来说花费太长时间。现在采取了快速双边过滤器。结果见下文。

由于对象段的获得结果与现有算法的竞争性较差,因此没有一种方法足以满足后处理步骤。
现有算法是非常本地化,因此适用于这种非常特殊的情况。

所以我问你,是否我完全错过了某些事情...
我没有进一步的想法,如何加工以及如何获得良好的轮廓效果而又没有间隙或孔。.
在不对CCD和物理环境进行大量更改的情况下是否有可能?


最后一种方法(经过一整夜的MO实验):


双边过滤器(保留边缘,但平滑均匀区域)
Canny(西格玛= 2,阈值= [0.04 0.08])
形态运算(MO):bwareopenclosingremovebridge


bwlabel仅用于选择轮廓的周长,可消除不必要的噪音。尚无更新的屏幕截图,但适用于明星。玻璃杯有一个与外部轮廓相连的内部轮廓,也可以在下面的屏幕截图中看到。

所以我担心我需要一种特殊的算法来遍历外部轮廓轮廓。
将是对邻居的一些顺时针/逆时针查找。如果有角点,则可以顺时针/逆时针切换该步。
如果有间隙,则增大半径并再次查看。
如果有两个或多个可能的跟随点,请选择与前面的方向相同。
您认为轮廓跟随算法有意义吗?



评论

您是否尝试过自适应阈值?您似乎没有提到它。我认为OTSU在消除噪声后应该会以某种方式工作,但自适应阈值可能会更好。

嗨,瑞,我尝试使用此Matlab扩展进行自适应阈值处理:自适应阈值下面是使用窗口参数的结果:第1次尝试第2次尝试第3次尝试如您所见,随着参数的增加,中间部分从白色变为黑色(很好,恕我直言),但背景的其余部分也变成了黑色,这很不好。

您是否尝试过一些基本的图像缩小技术?例如,减去平场校正以消除右上角的变暗现象(en.wikipedia.org/wiki/Flat-field_correction)。同样,如果粒子是静态的,它们将立即被移除。然后,您可以使用任何想要的边缘检测方法...

嗨,菲尔,据我所知,据我所知,有一系列照片是在物体进入熔炉之前拍摄的。因此,校准的种类在这里。我星期一将与负责CCD和环境的物理学家交谈。但是,感谢您的建议,我会给您一个机会!

您添加的第二张图片看起来完全不同。您可以发布所有可能的图片吗?

#1 楼

您可以尝试以下操作:


基于图的有效图像分割:
http://www.cs.brown.edu/~pff/segment/(可用代码)
基于GraphCut的分割:
http://www.csd.uwo.ca/~olga/OldCode.html(可用代码)
首先使用稀疏方法对图像进行去噪:
http://spams-devel.gforge.inria.fr/(提供代码)


评论


$ \ begingroup $
oli,您好,关于稀疏方法:您能具体说明我应该使用该代码的哪些方法吗?我对该部分的了解不是很深,我在文档中没有找到关于降噪或模糊的有用信息……谢谢。
$ \ endgroup $
–mchlfchr
2012-10-12 17:28

$ \ begingroup $
您可以在以下位置找到“易于使用”的版本:lear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
$ \ endgroup $
–oli
2012年10月12日17:36

$ \ begingroup $
很抱歉再次抱怨;-) ...您也有win32源码吗?再次感谢你!
$ \ endgroup $
–mchlfchr
2012年12月12日17:54

$ \ begingroup $
恐怕我不会... $ \ endgroup $
–oli
2012年10月12日17:58

#2 楼

我认为您太早放弃了阈值技术。看看您的直方图,它显然是三峰的:
(我手动删除了图像右侧的白色列,我认为它们不是图像的一部分-请在运行我的图像之前获取此图像代码)



看看第一组中的所有值:



为了在三峰直方图中找到模式,可以使用强度为K=3的K均值聚类。下面的Matlab代码在您的代码中找到th1=67。这个想法是假设您有3组,并在每组上计算加权质心。然后,将每个强度级别分配给它自己的群集。当加权质心停止移动时,您将停止。这是在图像上找到两个阈值的结果,如直方图所示。



function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end


解决问题很简单蛋糕,只需执行一些简单的形态操作,例如打开。

评论


$ \ begingroup $
嗨,安德烈,但是我应该如何概括您提到的阈值呢?我有几种情况,不仅是一种情况,而且我仍然需要自动化。而且Otsu Thresholding(在matlab中起作用)没有给我带来很好的效果。还有其他提示吗?亲切的问候
$ \ endgroup $
–mchlfchr
2012年10月13日15:06

$ \ begingroup $
再次感谢您,到目前为止,但是代码无效。出现空白图形屏幕。使用我的原始数据(位图)和您上面发布的PNG进行了尝试。我正在调试...
$ \ endgroup $
–mchlfchr
2012年10月13日15:54

$ \ begingroup $
@mchlfchr,您有图像处理工具箱吗?如果您不这样做,则可以将imhist更改为hist
$ \ endgroup $
– Andrey Rubshtein
2012年10月13日15:56

$ \ begingroup $
@mchlfchr,请参阅更新的版本
$ \ endgroup $
– Andrey Rubshtein
2012年10月13日15:58

$ \ begingroup $
Andrey,如果我插入原始位图文件,结果将与我在原始帖子中提到的一样。关于分辨率可能正在发生这种情况吗?源图像为576x768像素和灰度(256)。如果我将您的函数与原始图像一起使用,则结果如下:i.imgur.com/UXALJ.png函数的直方图-i.imgur.com/7RiPP.png感谢您的帮助!问候
$ \ endgroup $
–mchlfchr
2012年10月13日17:43

#3 楼

如以上所建议的,阈值处理对于该图像是非常有效的,该图像本质上是二进制的,除了恒定的阈值由于照明不均匀而不会起作用。您需要自适应阈值。

我的建议是通过在光线中采样少量值,使用简单模型(可能是平面[3 DOF]或四半径[6 DOF])进行背景重建。地区。最好是使用小的ROI来平均掉噪声。然后通过减去(或除以)背景值来校正阴影。

如果不能进行人机交互,则可以先直接进行大津并考虑均匀的ROI(低方差)来自动搜索背景区域)远远低于阈值。在第一次背景重建之后,您可以通过将这一过程应用于经过平面校正的图像来进行改进。

整个过程可以在不到一秒的时间内运行。

评论


$ \ begingroup $
Yves,您最好选择自动化处理。 DOF方面很有趣,但是我不确定Otsu方法,因为Otsu本身运行不佳。我是否想正确地选择图像的随机区域,然后对所有拾取区域的平均值求阈值?亲切的问候
$ \ endgroup $
–mchlfchr
2012年10月13日12:52

#4 楼

我认为最好的方法是使用活动轮廓。如果您不清楚活动轮廓是什么,请在youtube http://www.youtube.com/watch?v=ijNe7f3QVdA

上观看此视频,基本上,您需要进行初始化分割并它将改善形状。
我的建议是针对本文中讨论的一种方法,并使用主动轮廓作为第二步。作为改进步骤。

这里是活动轮廓的一种实现,您可以使用
http://www.mathworks.com/matlabcentral/fileexchange/19567

评论


$ \ begingroup $
欢迎使用dsp.se :)感谢您的贡献,您提供了一个不错的答案。如果您想做得更好,我想为以下一些问题提供答案会很有趣:为什么您认为这是最好的方法(例如,您在使用技术方面有个人经验)?您认为哪些建议的方法与您的建议结合使用会更好?请对该技术进行简短说明,或者,如果有时间,请尝试在提供的示例图像上使用该技术提供实验结果。并在dsp上玩得开心!
$ \ endgroup $
–佩内洛普
2012年10月26日16:13

$ \ begingroup $
@mkuse,正如您可能已经读过第一篇文章一样,我已经尝试过将主动轮廓与降噪和边缘贴图结合使用。结果很差,并且对于大图像来说运行时间很差。
$ \ endgroup $
–mchlfchr
2012年10月27日在6:50

$ \ begingroup $
您如何看待降噪技术。您可以在这里找到这些内容的摘要:lnmiitdip.files.wordpress.com/2011/12/…
$ \ endgroup $
–mkuse
2012年10月27日上午11:04

$ \ begingroup $
@mkuse,我已经在最初的帖子中提到了您在PPT文件中发布的机制。我编辑了我的第一篇文章,以使其更清楚地说明我使用了哪种过滤器。
$ \ endgroup $
–mchlfchr
2012年10月27日13:08

#5 楼

您清楚地知道自己要做什么,但是您没有提到使用阈值,特别是您是否尝试过使用Otsu应用全局阈值来计算正确的水平,然后找到轮廓并选择最大的阈值?

[编辑以澄清问题]

由于图像中可见的明显阴影,全局阈值显然不起作用。

我对此进行了快速处理,发现如果您破坏了将图像分成6个块(2行,每列3列,大小相等),然后在每个图像上使用Otsu进行阈值处理,然后重新组装,在清理图像方面做得非常出色。

在恒星的右上方仍然有一些小瑕疵。

在我看来,由于对象具有直线边界,您可能需要考虑使用霍夫变换来提取这些边缘,将它们相交以定位顶点,然后将结果用作对象轮廓。
/>

评论


$ \ begingroup $
Dave,我尝试过Otsu,但它带来的效果是右上层背景与对象合并在一起,这是绝对不能接受的。
$ \ endgroup $
–mchlfchr
2012年10月12日15:16

$ \ begingroup $
嗨,戴夫,由于运行时要求,而且我不了解HT,因此不能选择Hough,因为它对于大型图像非常耗时。
$ \ endgroup $
–mchlfchr
2012年10月13日15:55

#6 楼

轮廓是一直是直线还是已知曲线?

如果是这样,那么与其尝试使边缘上的每个像素都正确,不如使用霍夫变换来获取直线的方程式,然后从线条和弯折部分

评论


$ \ begingroup $
正如我已经提到的:我需要附近的实时方法。据我所知,HT非常耗时。另一方面是,我不知道曲线和直线并不总是直线。轮廓取决于炉子中的材料(有关更多信息,请参见我的原点)。
$ \ endgroup $
–mchlfchr
2012年10月13日17:27

$ \ begingroup $
对于直线,它非常快,如果您大致知道直线的位置(例如,从前一帧开始),则只能搜索该参数空间
$ \ endgroup $
–马丁·贝克特(Martin Beckett)
2012年10月13日18:36