2015-12-22 20 views
10

Próbuję wyodrębnić podpis Radona, aby rozpoznać wzory ubrań (paski, pled, nieregularne i bez wzoru), jak to zrobiono w 1.Przetwarzanie obrazu - Wykorzystanie transformacji radonu do rozpoznawania wzorów w MATLAB

algorytm realizowany:

1. Use sobel operator to compute the gradient map as f(x,y). 
2. Perform Radon transform based on maximum disk area. 
3. Compute the variance of r under all theta directions. 
4. Employ L2-norm to normalize the feature vector. 
5. Plot Radon Signature as a bar chart of var(r) for all theta values. 

Zrobiłem następujące:

img = imread('plaid.jpg'); 
grey = rgb2gray(img); 
img2 = edge(grey, 'sobel'); 
vararray=zeros(1,size(theta,2)); 
theta = -89:90; 
for j = 1: size(theta,2) 
    [R3,xp3] = radon (img2,theta(j)); 
    vararray(j) = var(R3); 
end 
vararray = vararray/norm(vararray); 
figure(1), bar(theta,vararray),title('Radon Signature'); 

wierzę, że mój błąd leży w pierwszych 2 etapach. Nie jestem pewien, jak wykonać Radon tylko na maksymalnym obszarze dysku.

Moje wyniki są pokazane po prawej stronie, natomiast z artykułu (wymienionego poniżej) po lewej.

Results Image (Left : Article's Results, Right: My Matlab results Input Image

jednak moje wyniki powinny przynajmniej Pokaż 2 odrębne szczyty, jak pokazano w wynikach acticle, ale tak nie jest.

Każda pomoc jest doceniana.

Źródło algorytmu: "wspierająca Odzież Wzór Uznanie dla niedowidzących ludzi" przez Xiaodong Yang, student, członek IEEE, Shuai Yuan i Yingli Tian Senior Member IEEE

+0

Ta figura z tego artykułu wydaje się być raczej doodle, a mniej faktyczną postacią naukową. Jesteś pewien, że należy go traktować poważnie? Czy na pewno zasięg theta jest taki sam? –

+0

Najważniejszą rzeczą, którą należy wziąć z wykresu artykułu, są 2 dominujące szczyty. To powinno być również obecne w moich wynikach, ale tak nie jest. Wierzę, że mój błąd leży w pierwszym kroku algorytmu 1, ale nie jestem pewien, jak to zrobić w Matlab – User404

+0

Nie mogę pomóc w przetwarzaniu obrazów, ale powinieneś wstępnie przydzielić vararray za pomocą 'vararray = zeros (1 , size (theta, 2)); 'przed pętlą i użyj' vararray (j) 'wewnątrz pętli, dla prędkości. –

Odpowiedz

2

Maksymalna powierzchnia dysku jest, jak @beaker myśl, zdefiniowana przez maksymalny wypełniony okrąg, który mieści się wewnątrz obwiedni obrazu. Można to zaobserwować na ryc. 3 b) artykułu.

Inną rzeczą, którą zrobiłeś źle, jest użycie detektora krawędzi edge(grey, 'sobel'), podczas gdy powinieneś użyć mapy gradientu lub większej formalnej gradientowej magnitudo. Oto kod, który tworzy krzywą bliską temu, co pokazano na Rys. 3d. Jak oszacować to do sześciu szczytów, pozostaje pytanie.

A = imread('Layer-5.png'); % image from the article 
A = double(rgb2gray(A)); 

% gradient magnitude 
dx = imfilter(A,fspecial('sobel')); % x, 3x3 kernel 
dy = imfilter(A,fspecial('sobel')'); % y 
gradmag = sqrt(dx.^2 + dy.^2); 

% mask by disk 
R = min(size(A)/2); % radius 
disk = insertShape(zeros(size(A)),'FilledCircle', [size(A)/2,R]); 
mask = double(rgb2gray(disk)~=0); 
gradmag = mask.*gradmag; 

% radon transform 
theta = linspace(0,180,180); 
vars = zeros(size(theta)); 
for u = 1:length(theta) 
    [rad,xp] =radon(gradmag, theta(u)); 
    indices = find(abs(xp)<R); 
    % ignore radii outside the maximum disk area 
    % so you don't sum up zeroes into variance 
    vars(u) = var(rad(indices)); 
end 
vars = vars/norm(vars); 
figure; plot(vars); 

Pamiętaj, że zdjęcia skopiowane z artykułu pojawiają się z artefaktami jpg. Po dobrym odszumiania (ciut zbyt dużo tutaj), np

denoised image

można uzyskać znacznie więcej wybitnych wyników.

+0

W jaki sposób wykonałeś denoising, aby uzyskać ten wynik? – User404

Powiązane problemy