如何使用MATLAB在卡车中找到木材?

10

我的问题是使用拖车后部的图像自动查找和计数货车上的木材。我正在尝试使用MATLAB图像工具箱解决此问题。所以,这是我的代码。

function [ centers, rads, metrics ] = TimberFind( img )
    minrad = 20;
    maxrad = 110;
    Hsens = .93;
    CannySens = .20;

    img_gray = rgb2gray(img);
    PSF = fspecial('gaussian', 5, 0.5);
    img_gray = imfilter(img_gray, PSF, 'symmetric', 'conv');
    img_gray = imadjust(img_gray);
    PSF=fspecial('gaussian', 10, 1);
    Blurred = imfilter(img_gray, PSF, 'symmetric', 'conv');
    cont = imsubtract(img_gray, Blurred);
    preprocessed = imadd(img_gray, 3*cont);    

    bin = edge(preprocessed, 'canny', CannySens);

    [cen, r, m] = imfindcircles(bin, [minrad maxrad],'Sensitivity', Hsens);  
end

但结果并不是很好。您可以查看完整数据集或以下示例:
第一张输入图片
第一张输出图片

如果我让Canny和imfindcircles算法足够敏感以便检测到所有木材,那么会有一些多余的结果。我有一个想法,通过从大图像中切出每个木材,然后构建一些获得小图片的全局标准,并尝试在其上使用一些机器学习算法来解决此问题。但我认为这种方法可能比较困难,也许有人能提供其他建议?也许在使用Canny算子之前有更好的图像预处理方式?如果您有任何更好的想法,请告诉我。谢谢!


1
你能发布原始图片吗,即没有红圈的那些? - Ratbert
1
当然,我把它们放到云端了。 - Vladimir
如果您看到了假检测,其中有一些可以使用后处理轻松移除。例如,假检测的外观与您发现的其他圆形不同。 - Autonomous
是的,我确实做到了。我还尝试使用亮度和纹理参数来消除虚假结果,但是图片太不同了(白天/黑夜,夏天/冬天),所以我无法通过使用某个阈值来正确地消除虚假检测来解决问题。然后我考虑了机器学习。 - Vladimir
1个回答

4
实际上,在使用imfindcircles之前,没有必要预处理您的图像,即不需要将其转换为灰度图像、进行高斯滤波或进行Canny边缘检测。您的代码的简化版本在这张图片上给出了一个非常不错的结果:

enter image description here

代码:

minrad = 20;
maxrad = 110;
Hsens = .93;

[cen, r] = imfindcircles(img, [minrad maxrad],'Sensitivity', Hsens);

结果如下:

enter image description here

有趣的是,结果比您原来的代码要好得多。简单就是美!

使用您的方法会导致我的图像效果不佳。但是,当我使用边缘检测时,我真的犯了一个错误,因为imfindcircles会自动执行此操作。所以,我进行了修复,结果变得更好了,但还不够好。 - Vladimir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接