在嘈杂图像中检测小斑点的技术

时间:2016-12-19 06:16:57

标签: matlab opencv image-processing computer-vision

我正在尝试编写一个程序,该程序使用计算机视觉技术来检测(和跟踪)非常嘈杂图像流中的微小斑点。图像流来自双X射线成像设置,其输​​出左视图和右视图(由于不同的准直而具有不同的尺寸)。我的数据有两种类型:一组图像不是那么嘈杂,我只是用它来尝试不同的技术,而另一组则吵闹,这就是检测需要在最后工作的地方。图像流为60 Hz。这是来自X射线成像仪的原始图像的示例:

enter image description here

以下是一些感兴趣区域的裁剪样本。需要检测的斑点是图像中心附近的小黑点。

Sample image 1 enter image description here enter image description here

最初,我开始在OpenCV中使用简单的轮廓/斑点检测技术,这些技术并不是很有帮助。最后,我转向使用形态学算子“打开”图像等技术,然后执行拉普拉斯高斯斑点检测以检测感兴趣的区域。这给了我更好的图像低噪声版本的结果,但是当涉及高噪声版本时却失败了:给了我太多的误报。这是低噪声图像的结果(请注意输入图像被反转)。

enter image description here

我在MATLAB中基于LoG的方法的代码如下:

while ~isDone(videoReader)
    frame = step(videoReader);
    roi_frame = imcrop(frame, [660 410 120 110]);

    I_roi = rgb2gray(roi_frame);
    I_roi = imcomplement(I_roi);
    I_roi = wiener2(I_roi, [5 5]);
    background = imopen(I_roi,strel('disk',3));

    I2 = imadjust(I_roi - background);
    K = imgaussfilt(I2, 5);
    level = graythresh(K);
    bw = im2bw(I2);

    sigma = 3;    
    % Filter image with LoG
    I = double(bw);
    h = fspecial('log',sigma*30,sigma);
    Ifilt = -imfilter(I,h);

    % Threshold for points of interest
    Ifilt(Ifilt < 0.001) = 0;
    % Dilate to obtain local maxima
    Idil = imdilate(Ifilt,strel('disk',50));

    % This is the final image
    P = (Ifilt == Idil) .* Ifilt;

有什么方法可以改进我目前的检测技术,使其适用于具有大量背景噪音的图像?或者是否有更适合此类图像的技术?

1 个答案:

答案 0 :(得分:1)

我将采取的方法:

- 平均背景扣除

-Agressive高斯平滑(this filter should be shaped based on your target object,在我的头顶上我想你希望sigma大约是物体最小横截面的一半,但你可能想要弄清楚这一点)基本上目标是模糊在不完全丢失目标物体的情况下尽可能地产生噪音(基于形状和大小)

-Edge检测。如果可能,尝试特定于对象(基本上,在高斯平滑后查看对象的边缘是什么样的,并设置边缘检测以查找宽度和对比度偏移)

- 可以考虑在这里运行一个关闭操作。

- 根据大小然后在形状上搜索岛屿(完全封闭区域)的整个图像。

我正在采取预感,尽管信噪比非常低,但您的噪音粒度有望明显小于您的物体尺寸。 (如果您的噪音与对象相同,对比度和球场大小相同......您已经沉没,需要重新评估您的收购情况)

另一个基于您的速度需求的说明。通过了解最近已知的位置并在本地搜索以及了解新目标可以从哪里进入图像,可以节省大量的处理成本。