2015-12-22 2 views
10

Ich versuche die Radon-Signatur zu extrahieren, um Muster von Kleidung (gestreift, kariert, unregelmäßig und musterlos) zu erkennen, wie in 1 getan.Bildverarbeitung - Verwenden von Radon-Transformation zur Mustererkennung in MATLAB

Algorithmus implementiert werden:

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'); 

Ich glaube, dass meine Fehler in den ersten 2 Stufen liegt:

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. 

ich folgendes getan haben. Ich bin mir nicht sicher, wie man Radon nur auf dem maximalen Plattenbereich ausführt.

Meine Ergebnisse werden auf der rechten Seite angezeigt, während aus dem Artikel (siehe unten) auf der linken Seite angezeigt wird.

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

jedoch meine Ergebnisse sollten zumindest zeigen zwei unterschiedliche Peaks, wie in der die jeweilige Artikel die Ergebnisse gezeigt, aber sie tun es nicht.

Jede Hilfe wird geschätzt.

Quelle Algorithmus: "Assistive Kleidung Mustererkennung für Sehgeschädigte" von Xiaodong Yang, Student Mitglied, IEEE, Shuai Yuan, und YingLi Tian, ​​Senior Member, IEEE

+0

Diese Figur aus dem Artikel scheint mehr ein Gekritzel und weniger eine tatsächliche wissenschaftliche Figur. Sind Sie sicher, dass es ernst genommen werden soll? Sind Sie sicher, dass der Theta-Bereich derselbe ist? –

+0

Die Hauptsache aus der Graphik des Artikels sind die 2 dominanten Peaks. Dies sollte auch in meinen Ergebnissen vorhanden sein, ist es aber nicht. Ich glaube, mein Fehler liegt im ersten Algorithmus Schritt 1, aber ich bin mir nicht sicher, wie dies in Matlab zu tun – User404

+0

Ich kann nicht mit dem Bildverarbeitung Zeug helfen, aber Sie sollten vararray mit 'vararray = Nullen (1 , Größe (Theta, 2)); 'vor der Schleife und verwenden Sie' Vararray (j) 'innerhalb der Schleife, für Geschwindigkeit. –

Antwort

2

Maximale Plattenbereich ist, als @beaker gedacht, definiert durch den maximal ausgefüllten Kreis, der in den Begrenzungsrahmen des Bildes passt. Das können Sie anhand der Abb. 3 b) des Artikels beobachten.

Eine andere Sache, die Sie falsch gemacht haben, wird unter Verwendung von Kantendetektor edge(grey, 'sobel'), während Sie Gradientenkarte oder mehr formal Gradientenhöhe verwenden sollten. Hier ist ein Code, der eine Kurve erzeugt, die nahe bei dem ist, was in Fig. 3d gezeigt ist. Wie man es auf sechs Peaks quantifizieren kann, bleibt eine Frage.

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); 

Denken Sie daran, Bilder, die aus dem Artikel kopiert wurden, werden mit jpg-Artefakten angezeigt. Nach gut Entrauschen (ein bisschen zu viel hier), zum Beispiel

denoised image

Sie bekommen viel mehr im Vordergrund Ergebnisse.

+0

Wie haben Sie das Entrauschen durchgeführt, um dieses Ergebnis zu erhalten? – User404