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

Größte Werte finden, mitteln, daraus Schwellwert bestimmen

 

Paula
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 24.08.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2009, 16:35     Titel: Größte Werte finden, mitteln, daraus Schwellwert bestimmen
  Antworten mit Zitat      
Hallo an alle Helf-Willigen Smile

Habe schon das Forum durchforstet, aber leider keine Lösung zu meinem recht speziellen Problem gefunden.

Ich möchte einen Schwellwert bestimmen, um ein Graustufenbild in ein SW-Bild umzuwandeln. Automatische Lösungen wie "graythresh" kommen nicht in Frage, da der Schwellwert genau die Hälfte des Maximalwertes von jeweils jeder Zeile des Bildes betragen soll (also 0,5).
Soviel zu den Grundvoraussetzungen.

Ich habe aber nun festgestellt, dass das alleinige Maximum für meine Betrachtung nicht ausreicht.
Jetzt kommt die Vorgehensweise, die ich gern umsetzen möchte, wobei es aber hapert:

Jede "Zeile" des Bildes einzeln betrachten und folgendes machen:
- Wert und Index des Maximums bestimmen und DAZU noch alle Werte (und zugehörige Indizes), die um 10% vom Maximum abweichen (dementsprechend geringer sind)
- Alle Werte und Indizes jeweils mitteln
- Aus den gemittelten Werten den Schwellwert bestimmen (mit 0,5 multiplizieren)
- Aus den gemittelten Indizes die "Spalten-Position" bestimmen, damit diese später eingezeichnet werden kann (auf eine ganze Zahl gerundet)

Soweit so gut.
Ich habe schon überlegt, ob das Ganze mit "hist" und "unique" funktionieren kann, wobei ich einen Bin mit 10% Abweichung vom Maximum bestimme. Aber wie setze ich das in Matlab um?

So siehts bisher aus, die Sachen oben sind aber nicht alle umgesetzt und es ist noch ziemlich zerwürfelt: Confused
Code:
% Finden der Achse durch Maximalwert jeder Zeile,
% Umwandeln in Binärbild und Konvertieren in Double
for p=1:(length(img_dif(:,1))-1)
    if  max(img_dif(p,:)) > 0
        % ermittelt Maximum der Zeile und Index
        [achswerte(p),maxspalte(p)] = max(img_dif(p,:));
        % sortiert Zeile nach Größe und findet Indizes
        [sortiert(p,:),index_sortiert(p,:)] = unique(img_dif(p,:));
       
        h = 5; % legt Anzahl der Werte auf 5 fest
        % sucht die 5 größten Werte heraus, sollen aber das Maximum und alle Werte 10% drunter sein
        abweichungen(p,:) = sortiert(end-h:end);
             
        % Histogramm der Zeile        
        histogramm(p,:) = hist(img_dif(p,:));
       
        % Bisheriger Schwellwert, Hälfte des Maximums
        % -> soll Hälfte des Mittelwertes aus 10%-Abweichung werden
        schwellwert = achswerte(p)/2;
               
        img_bw(p,:) = im2double(im2bw(img_dif(p,:),schwellwert));
    end
end

Ich habs zwar geschafft, die insgesamt größten 5 Werte rauszusuchen, aber nicht diese 10%-Abweichung. Die Abhängigkeit von p jeder Variable ist zur späteren Kontrolle.
Hat jemand eine Idee? Wahrscheinlich fehlt mir mal wieder nur der richtige Matlab-Ausdruck...

Würd mich über Hilfe freuen!
LG

edit by steve: Thema in Bildverarbeitung verschoben Wink
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 30.08.2009, 10:41 Uhr von steve
Von Programmierung nach Bildverarbeitung


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 30.08.2009, 12:23     Titel:
  Antworten mit Zitat      
Moin,

ich hab mich mal bemüht was zusammen zuschustern und auch zu kommentieren Wink
Code:
A = magic(5); % Beispielmatrix
maxis = max(A,[],2); % Maxima zeilenweise bestimmen
relmaxis = maxis.*.9; % 10% Grenze einbeziehen
[rows cols] = find(A>=meshgrid(relmaxis)'); % Positionen finden
sortedrows = sortrows([rows cols]); % Positionen zeilenweise sortieren
numberrows = size(A,1);
meanindis = zeros(numberrows,1); % Initiieren der Vektoren
meanvalues = zeros(numberrows,1); % Initiieren der Vektoren
for k=1:numberrows
    % Bestimmen der Mittelwerte
    meanvalues(k) = mean(A(unisort(k),sortedrows(sortedrows(:,1)==unisort(k),2)));
    % Bestimmen der mittleren Idizies
    meanindis(k) = round(mean(sortedrows(sortedrows(:,1)==unisort(k),2)));
end
% jeweiligen Schwellenwert berechnen
schwellenwerte = meanvalues.*.5;


Ich hoffe, das passt so zu deinen Anforderungen.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
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.