2015-04-19 9 views
10

Moim problemem jest odnalezienie i policzenie drewna w ciężarówce automatycznie za pomocą obrazu z tyłu przyczepy. Próbuję rozwiązać ten problem za pomocą MATLAB Image Toolbox. Oto mój kod.Jak znaleźć drewno w ciężarówce za pomocą 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 

Ale wynik nie jest zbyt dobry. Można zobaczyć the full data zestaw lub następujący przykład: first input image first output image

więc jeśli robię obrotny i imfindcircles algorytmy wystarczająco sensetive wykryć wszystkie rodzaje drewna, istnieją pewne znalezione nadmiar resoults. Mam pomysł, aby rozwiązać ten problem, wycinając każde drewno z dużego obrazu, a następnie wprowadzając pewne globalne kryteria uzyskiwanych małych obrazów i wypróbowując na nim algorytm uczenia maszynowego. Ale myślę, że ta droga jest raczej trudna, więc może ktoś mógłby zasugerować cokolwiek innego? Może jest lepszy sposób na wstępne przetworzenie obrazu przed użyciem operatora Canny? Jeśli masz pomysł, jak to poprawić, proszę powiedz mi. Dzięki!

+1

Czy możesz zamieścić oryginalne obrazy, _i.e. bez czerwonych okręgów? – Ratbert

+1

Oczywiście, umieściłem je w chmurze. – Vladimir

+0

Jeśli widzisz fałszywe wykrycia, niektóre z nich można łatwo usunąć za pomocą przetwarzania końcowego. Na przykład wygląd fałszywych detekcji różni się od innych znalezionych kręgów. –

Odpowiedz

4

Właściwie nie ma naprawdę potrzeba Preprocesuj zdjęć, tj nie dzieje skali szarości, Gaussian filtrowanie ani wykrywania krawędzi Cany są rzeczywiście przydatne przed użyciem imfindcircles.

Uproszczona wersja kodu daje bardzo przyzwoity wynik na tym zdjęciu:

enter image description here

Kod:

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

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

A wynik:

enter image description here

Inte spontanicznie, wynik jest o wiele lepszy od tego, co robi twój oryginalny kod. Im prostsze, tym lepiej!

+0

Korzystanie z Twojej drogi prowadzi do złego odświeżenia moich zdjęć. Ale naprawdę popełniłem błąd, gdy używałem wykrywania krawędzi, ponieważ imfindcircles robi to sam. Naprawiłem to i poprawiłem się, ale nie wystarczająco dobrze. – Vladimir

Powiązane problemy