Как найти древесину в грузовике с помощью 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 image]()
![first 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]()
Интересно, что результат намного лучше того, что делает ваш оригинальный код. Чем проще, тем лучше!