Ermittlung von verschiedenen münzwerten von einem Bild unter Verwendung von MATLAB

Ich versuche zu identifizieren, und die Anzahl der Treffer und Münzen jedes Wertes, in einem Bild mit Hilfe von MATLAB.
Hier ist das Ausgangsbild, mit Streichhölzern und 4 verschiedene Münzwerte.
(5 kleine silberne, 2 kleine gold -, 2 grosse silberne, 4 große gold-Münzen)
Ermittlung von verschiedenen münzwerten von einem Bild unter Verwendung von MATLAB

Die Ausgabe:
Ermittlung von verschiedenen münzwerten von einem Bild unter Verwendung von MATLAB

Hier ist der code:

close all;
img = (imread('C:\Users\Torstein\Jottacloud\Skole\Visu\Prosjekt\sample_images\sample2.jpg'));
img_gray = rgb2gray(img);

% Filter image for easier edge detection
m = 12;
n = 12;
img_filter = imfilter(img_gray, fspecial('average', [m n]));
%figure, imshow(f), title('f')

% Edge detection
[~, threshold] = edge(img_filter, 'canny');
fudgeFactor = 1.5;
img_edge = edge(img_filter, 'canny', threshold * fudgeFactor);
figure, imshow(img_edge), title('edge detection')

% Dilate image to make the coin edges complete without holes
se_disk = strel('disk',4);
se_line1 = strel('line',3,100);
se_line2 = strel('line',3,100);
img_dilated = imdilate(img_edge, se_disk);
img_dilated = imdilate(img_dilated, [se_line1 se_line2]);
figure, imshow(img_dilated), title('dilate')

% Remove small objects (noise) and fill complete objects
img_clearborder = imclearborder(img_dilated, 4);
%figure, imshow(BWclear), title('cleared border image');
img_fill = imfill(img_clearborder, 'holes');
figure, imshow(img_fill), title('fill holes')

% Erode image to make a clear cut between objects
se_diamond = strel('diamond',2);
img_erode = imerode(img_fill,se_diamond);
for k=1:3
    img_erode = imerode(img_erode,se_diamond);
end
img_nosmall = bwareaopen(img_erode,300);
figure, imshow(img_nosmall), title('erode')

[B, L] = bwboundaries(img_nosmall);
figure, imshow(label2rgb(L, @jet, [.5 .5 .5])), title('boundaries')
hold on
for k = 1:length(B)
  boundary = B{k};
  plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end

stats = regionprops(L,img(:,:,1),...
    'Area','Centroid','Orientation','EquivDiameter','MeanIntensity');
threshold = 0.80; % For differentiating coins from matches based on an objects circularity

coinCentroids = [];
coinIntensities = [];
matchCentroids = [];
matchAngles = [];
coinRatios = [];

for k = 1:length(B)
    boundary = B{k};
    delta_sq = diff(boundary).^2;
    perimeter = sum(sqrt(sum(delta_sq,2)));
    area = stats(k).Area;
    metric = 4*pi*area/perimeter^2;
    metric_string = sprintf('%2.2f',metric);
    angle_string = sprintf('%2.2f',stats(k).Orientation);
    centroid = stats(k).Centroid;
    if metric > threshold
        % Object is round, therefore a coin
        coinCentroids = [coinCentroids; centroid];
        coinIntensities = [coinIntensities; stats(k).MeanIntensity];
        coinRatios = [coinRatios; stats(k).EquivDiameter/area];
    else
        % Object is a match
        angle = stats(k).Orientation;
        matchCentroids = [matchCentroids; centroid];
        matchAngles = [matchAngles; angle];
    end

    plot(centroid(1),centroid(2),'ko');
%     text(boundary(1,2)-35,boundary(1,1)+13,angle_string,'Color','y',...
%       'FontSize',14,'FontWeight','bold');

end

Wie Sie sehen können, habe ich erkannt welche Objekte sind die Münzen und die Objekte entspricht.
Aber, ich habe große Probleme bei der Erkennung, auf welchen Wert die Münzen haben.

Beispielsweise, Fläche/Durchmesser der Münzen, gibt die folgenden Ergebnisse. Ich sehe keinen klaren Art und Weise zu unterscheiden, die verschiedene Arten von Münzen ausschließlich auf Grundlage dieser Daten; die zahlen sind einfach zu eng.

0.0041
0.0042
0.0043
0.0043
0.0044
0.0045
0.0048
0.0048
0.0053
0.0054
0.0055
0.0055
0.0056

Ich versuchte, die Durchschnittliche Farbe von der Intensität ab Bild jeder Münze zu, aber das Tat mir nicht helfen, trennen Sie die Silber farbigen Münzen aus dem gold farbigen Münzen.

Meine von der Intensität Roter Kanal gibt keine Informationen, dass es 6 gold-farbigen Münzen und 6 Silber farbigen Münzen.

  105.0104
  105.4408
  107.9070
  112.4762
  116.3412
  127.3481
  132.1418
  137.9697
  149.6601
  159.2506
  167.6910
  181.1673
  215.0395

Frage: Wie kann ich identifizieren die verschiedenen Münz-Werte?

(Gefragt, wie separate zwei verbundene Objekte hier: Separate zwei überlappende Kreise in einem Bild mit Hilfe von MATLAB )

Dank

  • Ich kann nicht sehen, die Bilder. Fehler 403.
  • Bitte aktualisieren Sie Ihre links mit den richtigen Bildern.
  • Hinzugefügt neue links, danke
  • versuchen regionprops mit der Eigenschaft 'Image' sollte Ihnen eine gute Trennung
  • schön gemacht. dies ist eine sehr gute Frage - zeigt eine Menge Aufwand auf Ihrer Seite und Fortschritt.
  • versuchen Sie bei der 'Eccentricity' Eigenschaft der Regionen.
  • eine weitere Größe, die vielleicht helfen, ist das Verhältnis zwischen dem Durchmesser und der Bereich jedes Objekts.
  • Sie sind sehr nah, so dass ich gewonnen ' T eine Antwort. Tragen Sie sich mit dem, was Shai Rede war, überprüfen Sie diesen Eintrag: mathworks.com/matlabcentral/answers/85363#answer_94853 . Es gibt eine schöne Formel, die berechnet die Rundheit eines Objekts. Wenn der Wert näher an 1, es ist näher an einem Kreis, während es kleiner als 1 weniger ähnelt einem Kreis. Verwenden regionprops mit den Parametern in der Formel zur Berechnung der zirkularität dann Schwelle mit so etwas wie 0.5 extrahieren Sie die kreisförmigen Objekte. Die post ruft zu nutzen Exzentrizität vorsichtig, wenn Sie sich entscheiden, es zu benutzen
  • Ich habe kein problem, die Differenzierung der Münzen aus die Spiele, aber ich kann nicht herausfinden, wie zu trennen die verschiedenen Münzen der Werte von einem anderen. Ich habe versucht, Fläche, Farbe, Intensität der verschiedenen RGB-Kanäle im Bild ab, aber kein Glück - die zahlen sind einfach nur zu nahe zu jedes andere. Irgendwelche Tipps?
  • Wie verwende ich regionprops mit 'Image' um separate Objekte? Ich finde keine Beispiele online und ich verstehe nicht, die Dokumentation sehr begrenzt.
  • arbeiten im debug-Modus und geben Sie es ein versuchen.
  • BTW, deine Frage war Recht langwierig. Warum don'; t break it in sub-tasks, die jeweils in einer anderen Frage. Sie können prüfen, die Beantwortung Ihrer eigenen Fragen - für die sub-Aufgaben, die Sie alreay herausgefunden. Verknüpfen Sie die Fragen zu jeder andere, also kann man den gesamten Prozess-end-to-end?
  • Entfernt unnötige Daten und stellte die Fragen klarer.
  • Ich noch stark fühlen, sollten Sie aufgeteilt in mehrere Fragen auf: Erste Frage gegeben Bild identifizieren Münzen vs-matches - diese können Sie sich selbst beantworten anhand der Informationen in den Kommentaren. Zweite Frage, wie man besser separate Objekte, für die dies besser geben input image und die aktuelle Maske. Dritte Frage, wie die Identifizierung der verschiedenen Münzen in das Bild.
  • Im Hinblick auf die nicht-homogene Ausleuchtung - Sie sind vertraut mit MATLAB-Beispiel?
  • Ja - die Filter, die ich benutzen, bringen bessere Ergebnisse als der code in dem Beispiel. Aber das ist nicht wirklich das problem, entweder ANGESICHTS der Tatsache, dass ich weiß, wo eine Münze ist, wie kann ich herausfinden, was es Wert ist?
  • Gefragt, wie separate verbundene Objekte here. Jetzt ist dieser thread befasst sich nur mit so identifizieren Sie die verschiedenen Münz-Sorten".
  • Ist es akzeptabel, verwenden Sie die Löcher in die Münzen, die als parameter den Wert ermitteln? Ich meine, wie soll ich sagen - Sie wissen, welche Münzen enthalten ein Loch, so dass Sie zunächst zu kategorisieren, die Münzen, die von der Existenz einer Loch-und weiter zu verfeinern durch die Gegend\Durchmesser - dies kann genug sein. Zu finden, die inneren Löcher, können Sie verwenden Sie eine Hough-Transformation auf der Suche nach bestimmten Radien (ich glaube, dass der radius der Löcher ist ~5px)...

InformationsquelleAutor tsorn | 2014-11-11
Schreibe einen Kommentar