Как найти древесину в грузовике с помощью MATLAB?

Моя проблема заключается в том, чтобы найти и считать древесину в грузовике автоматически, используя изображение с задней стороны прицепа. Я пытаюсь решить эту проблему с помощью MATLAB Image Toolbox. Итак, вот мой код.

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

Но результат не очень хорош. Вы можете увидеть полный набор данных или следующий пример: first input imagefirst output image

Итак, если я сделаю Canny и imfindcircles алгоритмы достаточно чувствительными, чтобы обнаружить всю древесину, есть некоторые избыточные найденные потери. У меня есть идея решить эту проблему, вырезая каждую древесину из большого изображения, затем создавая некоторые глобальные критерии получения небольших изображений и пробую на нем алгоритм машинного обучения. Но я думаю, что этот путь довольно сложный, может быть, кто-нибудь может предложить что-нибудь еще? Может быть, есть лучший способ сделать предварительную обработку изображения перед использованием оператора Canny? Если у вас есть идея, как сделать это лучше, скажите мне. Спасибо!

Ответ 1

На самом деле нет необходимости предварительно обрабатывать ваши изображения, т.е. ни одно из изображений в градациях серого, гауссовская фильтрация и обнаружение края Cany не являются полезными перед использованием imfindcircles.

Упрощенная версия вашего кода дает очень приличный результат на этом изображении:

enter image description here

Код:

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

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

И результат:

enter image description here

Интересно, что результат намного лучше того, что делает ваш оригинальный код. Чем проще, тем лучше!