Mam obraz, który wygląda jak ten poniżej:
Próbuję znaleźć promień (lub średnicę) koła. Próbowałem użyć okrągłej transformacji Hougha (przez matlaba imfindcircles(bw,[rmin rmax],'ObjectPolarity','bright')
) i dopasowując się do koła lub elipsy (funkcja stworzona przez dom, która działa całkiem dobrze dla mniej hałaśliwych danych, patrz poniżej).
Próbowałem także przetwarzania obrazu, aby uzyskać wyraźniejszy okrąg, na przykład patrz poniżej:
se = strel('disk', 2);
bw = imdilate(bw, se);
bw = bwareaopen(bw,100000);
bw = edge(bw);
Jednak gdy przesyłam przetworzony obraz do dowolnej techniki (dopasowanie Hougha i elipsy koła) żadna z nich nie zdoła wykryć koła w przyzwoity sposób.
Oto fragment kodu wyszukiwarki okręgu, którą napisałem (matlab) [row col] = find (bw); kontur = bwtraceboundary (mc, wiersz (1), col (1)], 'N', connectivity, num_points);
x = contour(:,2);
y = contour(:,1);
% solve for parameters a, b, and c in the least-squares sense by
% using the backslash operator
abc = [x y ones(length(x),1)] \ -(x.^2+y.^2);
a = abc(1); b = abc(2); c = abc(3);
% calculate the location of the center and the radius
xc = -a/2;
yc = -b/2;
radius = sqrt((xc^2+yc^2)-c);
Docenione zostaną alternatywne podejścia ...
Odpowiedzi:
Oto moje rozwiązanie, jest zbliżone do pomysłu @ Yody, ale zmieniłem kilka kroków.
Oto odpowiedni kod Matlaba. Korzystam z transformacji Hougha dla pliku .m kręgów w moim kodzie.
źródło
Wykonanie tego przy użyciu przetwarzania obrazu jest dość proste. Poniżej znajduje się dowód koncepcji w Mathematica . Musisz to przetłumaczyć na MATLAB.
img
.Binaryzuj obraz i rozszerz go, a następnie wypełnij transformację. Usuwam również zbłąkane małe elementy, które nie są podłączone do głównego obiektu blob. Powinien dać ci coś takiego:
Następnie znajdź środek ciężkości tego obiektu blob i równoważny promień dysku obiektu blob (wszystkie openCV, MATLAB mają równoważne polecenia, aby to zrobić)
Otóż to! Teraz wykreśl oryginalny obraz i okrąg z powyższym środkiem i promieniem, aby zobaczyć, jak pasuje:
źródło