2012-11-13 16 views

Odpowiedz

2

Oto wynik zastosowania korelacji krzyżowej ze sztucznym kołem jako filtrem. Rezultatem jest [wiersz, kolumna] od lewego górnego rogu:

>> disp(centers) 
     483  1347 
     460   662 
     478  1001 
     451   290 

Nie ma szczegółowe komentarze, poproś to wymagane.

im = rgb2gray(im2double(imread('D:/temp/circles.jpg'))); 
r = 117; % define radius of circles 
thres_factor = 0.9; % see usage 
%% 
[x, y] = meshgrid(-r : r); 
f = sqrt(x .^ 2 + y .^ 2) >= r; 
%% 
im = im - mean(im(:)); 
im = im/std(im(:)); 
f = f - mean(f(:)); 
f = f/std(f(:))/numel(f); 
imf_orig = imfilter(im, f, 'replicate'); 
%% search local maximas 
imf = imf_orig; 
[n_idx, m_idx] = meshgrid(1 : size(imf, 2), 1 : size(imf, 1)); 
threshold = thres_factor * max(imf(:)); 
centers = []; % this is the result 
while true 
    if max(imf(:)) < threshold 
     break; 
    end 
    [m, n] = find(imf == max(imf(:)), 1, 'first'); 
    centers = cat(1, centers, [m, n]); 
    % now set this area to NaN to skip it in the next iteration 
    idx_nan = sqrt((n_idx - n) .^ 2 + (m_idx - m) .^ 2) <= r; 
    imf(idx_nan) = nan; 
end 

enter image description here

+0

Facet, który wykorzystał kod powiedział, że pracował i poprosił „Gdzie należy umieścić polecenie wydruku i która zmienna jest używana?” – HSN

+1

odbywa się to za pomocą 'figure, imagesc (imf_orig); colorbar; '. Oczywiście po obliczeniu 'imf_orig'. – Serg

1

Przypominam sobie, że robię to na uniwersytecie, wiele lat temu!

Co zrobiliśmy było zastosować próg i zrobić wszystko w czerni i bieli. Następnie usunęliśmy biały obszar (nieokrągły), aby rozprzestrzenił się na koła.

Kiedy zaczęli znikać, mieliśmy współrzędne.

Można również wybrać dwa punkty na obwodzie, znaleźć dokładny środku linii między nimi, a następnie narysować linię prostopadłą przez ten punkt. Jeśli w środku nowej linii jest środek okręgu.

+0

może mi Pan powiedzieć więcej o „blobing” .. Wybacz moją ignorancję, ale nie jestem tak dobry w Matlab i im z tym pytaniem w imieniu mojego przyjaciela ... dawka go mieć z tym coś wspólnego? http://www.commsp.ee.ic.ac.uk/~jahangiri/Blobdetector.html – HSN

5

to możliwe, przez jeden wywołanie regionprops:

img = imread('KxJEJ.jpg');      % read the image 
imgbw = ~im2bw(img,graythresh(img));   % convert to grayscale 

stats = regionprops(bwlabel(imgbw), 'centroid','area'); % call regionprops to find centroid and area of all connected objects 
area = [stats.Area];       % extract area 
centre = cat(1,stats.Centroid);     % extract centroids 

centre = centre(area>10,:);      % filter out dust specks in the image 

teraz centre zawiera Nx2 tablicy: pierwszej kolumnie X-pozycji, druga kolumna y położenie punktów:

centre = 

    289.82  451.73 
    661.41  461.21 
    1000.8  478.01 
    1346.7  482.98 
+0

napotkał ten błąd http://www4.0zz0.com/2012/11/13/21/243181924. jpg – HSN

+1

musisz używać starszej wersji, co się stanie, jeśli dodasz sugestię błędu: 'stats = regionprops (bwlabel (imgbw), 'centroid', 'area');'? –