WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Bereiche in Bild von Hand markieren

 

Thajobe

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2018, 23:36     Titel: Bereiche in Bild von Hand markieren
  Antworten mit Zitat      
Hallo Zusammen,

ich nutze jetzt zum erstenmal aktiv dieses Forum.
Also gerne auf Fehler hinweisen, wie falscher Ort etc.

Ich habe einen Algorithmus geschrieben, der Objekte in einem Bild (jpg) erkennen kann.
Um diesen zu bewerten muss ich das Bild auch von Hand klassifizieren.
Also jedem Pixel eine Klasse zuweisen.

Allerdings habe ich bisher keine effiziente Methode gefunden um Bereiche in einem Bild auszuwählen und die Klasse zuzuweisen.


Ich freue mich auf eure Tipps.


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.07.2018, 04:44     Titel: Re: Bereiche in Bild von Hand markieren
  Antworten mit Zitat      
Hallo Thajobe,

Erkläre doch mal genauer, wie Du die Bereiche markieren möchtest und was "die Klasse zuweisen" bedeutet.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Thajobe

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2018, 12:12     Titel: Re: Bereiche in Bild von Hand markieren
  Antworten mit Zitat      
Hallo Jan,

also als Ergebnis möchte ich eine Matrix von der selben Größe wie mein Bild. (nur halt ohne dritte Dimension). Jeder Eintrag in der Matrix ist dann einem Pixel zugeordnet und kennzeichnte seine Klasse. Z.B. Alle einträge mit 0 bilden eine Klasse, Einträge mit 1 bilden eine Klasse, usw.

Wenn es möglich ist würde ich mir das markieren so vorstellen, dass man das Bild anzeigt, und dann mit der Maus mehrmals Bereiche markieren kann (Kann z.B. Kreise oder Quadrate sein) die in dem Objekt liegen dem man eine Klasse zuweisen möchte. Auch sollte man einzelne Pixel markieren können.
Am besten wird dabei farblich gezeigt, welche pixel markiert sind. Und dann soll allen markierten Pixeln der wert der Klasse in der Matrix zugeordnet werden.

Falls es einen andere Möglichkeit gibt die leichter umzusetzten ist aber zum selben Ergebnis führt, ist das auch ok.

Gruß
Thajobe
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.07.2018, 11:55     Titel: Re: Bereiche in Bild von Hand markieren
  Antworten mit Zitat      
Hallo Thajobe,

Das klingt nach einem Programmierprojekt. Man kan mit der Image-Processing-Toolbox zwar Pixel und Bereiche auswählen, aber es hört sich so an, als bräuchtest Du hier ein ziemlich umfangreiches Tool. Ich kenne keine fertige Implementierung dafür.

Man muss z.B. berücksichtigen, dass sich markierte Bereiche überlappen könnten. Das farbliche Markieren einzelner ausgewählter Pixel ist eine Wissenschaft für sich, denn im Allgemeinen wird die Markierung den Pixel überdecken, was das weitere Arbeiten ausgesprochen behindert.

Da die Aufgabe aber eigentlich ziemlich üblich klingt, könnte es dafür bereits fertige Tools geben. Hast Du mal im Internet oder speziell im FileExchange von Matlab gesucht?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Thajobe

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2018, 00:02     Titel:
  Antworten mit Zitat      
Wenn ich Code gefunden hätte den ich nutzen könnte hätte ich nicht im Forum gefragt.
Habe mir jetzt selber den Code geschrieben.
Für den Fall das jemand irgendwann das selbe Problem hat poste ich hier den Code.

Gruß
Thajobe

Code:

in_file = 'yourImage';
%in_file = 'file';
path = ['bilder\', in_file, '.jpg'];
out_file = [in_file, '_class', '.mat'];

img0 = imread(path);

fig_h = figure;

global imgb_h
imshow(img0);
hold on
black = zeros(size(img0));
imgb_h = imshow(black);
set(imgb_h, 'AlphaData', 0.5);

global k;
k = '0';

global img_class;
img_class = zeros(size(img0,1), size(img0,2));
global class;
class     = 1;
global radius
radius = 100;

global xI
global yI
[xI, yI] = meshgrid(1:size(img0,2), 1:size(img0,1));


set(fig_h,'KeyPressFcn',@keyRead, 'WindowButtonDownFcn', @mouseClicked, ...
    'WindowButtonMotionFcn', @showCircle, 'DeleteFcn', @deleteFig);


global circle_h
circle_h = viscircles([100,100], 50,'EdgeColor','b');


drawnow
disp('press c to choose your class \npress r to choose th radius\npress x to exit')

while k ~= 'x'
drawnow
end

if ishandle(fig_h)
    close (fig_h);
end


 save(out_file,'img_class');
 
 %clear all;
 %load(out_file);

    function keyRead(src, event)
        global k
        global class
        global radius
            key = event.Key;

            if key == 'c'
                commandwindow
                prompt = 'choose your class: ';
                disp(prompt)
                str = input('','s');
                class = str2double(str);
            elseif key == 'r'
                commandwindow
                prompt = 'choose radius: ';
                disp(prompt)
                str = input('','s');
                radius = str2double(str);
            elseif key == 'x'
                k = 'x';
            end
            figure(src)
   end
   

   function mouseClicked(objectHandle , eventData )
        global imgb_h
        global img_class;
        global class;
        global xI
        global yI
        global radius
        alpha = 0.5;
        pos = get(get(objectHandle, 'CurrentAxes'), 'CurrentPoint');
        pos = [pos(1,1), pos(1,2)];
       
       
        img_class((xI - pos(1)).^2 + (yI - pos(2)).^2 <= radius.^2) = class;
       
        I  = ones(size(xI))*alpha;
        I(img_class == class) = 0;
       
        set(imgb_h, 'AlphaData', I);
    end
   
    function deleteFig(objectHandle, eventData)
    global k
    k = 'x';
    end
   
    function showCircle(objectHandle, eventData)
        global circle_h
        global radius
        delete(circle_h)
        pos = get(get(objectHandle, 'CurrentAxes'), 'CurrentPoint');
        pos = [pos(1,1), pos(1,2)];
        circle_h = viscircles([pos(1),pos(2)], radius,'EdgeColor','b');
    end
   
   
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.