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

Histogrammspreizung

 

Davaaron

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2016, 13:26     Titel: Histogrammspreizung
  Antworten mit Zitat      
Hi,

ich soll eine Funktion entwickeln, die als Input-Parameter ein Bild bekommt (Grauwertbild) und ein Bild zurückliefert.
Die Funktion soll den globalen Kontrast des Bildes verbessern. Sehr präzise ist dies leider nicht, aber ich vermute mal, dass das Minimum und Maximum auf 0 bzw 255 erweitert werden sollen.

Obwohl es ein Grauwertbild ist, ist es trotzdem im RGB-Stil vorhanden, also hat 3 Dimensionen diese Matrix. Size liefert allerdings ein gravierender Fehler, denn in [M N] ist N=765, also das multiplizierte Ergebnis der 2.D mit der 3.D!
Keine Ahnung was sich Matlab dabei denkt oder wie das implementiert ist.
Auf jeden Fall ist meine Idee folgende:
Min und Max Werte des Bildes ermitteln. Dann "einfach" nur Werte in die Formel einsetzen, um die Min und Max Werte zu spreizen.


Dies ist bisher mein Code:
Code:

function bild_out = HistSpreizung(bild_in)
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here
[I, map] = imread(bild_in, 'png');
g=I;
[m,n] = size(g);
g_new = zeros(m,n,3);
w_min = 0;
w_max = 255;
g_min = min(g(:));
g_max = max(g(:));

for k=1:3
    gg= g(:,:,k);
    for i = 1:m
        for j = 1:length(g)
            g_new(i,j,k) = (gg(i,j)-g_min)* ((w_max-w_min)/(g_max-g_min));
        end
    end
end
bild_out = g_new;
end
 


Das Problem ist N, da die Dimension einfach nicht stimmt. Also hat g_new nicht die exakte Dimensionsgröße wie das Originalbild, sondern ist 3 Mal so breit.

Könnt ihr mir helfen?


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2016, 13:43     Titel:
  Antworten mit Zitat      
Hallo,

wenn du ein 3D-Array hast, würde ich size auch mit 3 Argumenten aufrufen.

Hast du denn mal in die Doku geschaut? Dort gibt es ja das Beispiel "Size of Dimensions in 3-D Array", das auf deinen Fall sehr gut passt - und in dem size eben mit 3 Argumenten aufgerufen wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Davaaron

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2016, 14:13     Titel:
  Antworten mit Zitat      
Stimmt, da ist wohl was dran. Wollte allerdings nur die ersten zwei Dimensionen bekommen, weswegen ich nicht 3 aufgerufen habe.
Aber jetzt passt es wieder:

Code:

[m,n,o] = size(g);
g_new = zeros(m,n,o);
w_min = 0;
w_max = 255;

for k=1Surprised
    gg= g(:,:,k);
    g_min = min(g(:));
    g_max = max(g(:));
    for i = 1:m
        for j = 1:n
            g_new(i,j,k) = (gg(i,j)-g_min)* ((w_max-w_min)/(g_max-g_min));
        end
    end
end
 


Allerdings lässt sich das neue Bild "g_new" nicht plotten bzw es ist nur ein kleiner schwarzer Punkt in der oberen Hälfte, rechts, zu erkennen.
Das Histogramm zeigt, dass der Wertebereich relativ ausgenutzt ist. Min liegt bei 0, Max liegt bei 205.
Die Formel ist korrekt, oder?
Ich weiß echt woran es liegen könnte, dass es nicht so funktioniert wie erwartet.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2016, 14:27     Titel:
  Antworten mit Zitat      
Hallo,

die inneren und, wenn ich es richtig sehe, auch die äußere for-Schleife könntest du dir durch vektorisierte Operationen schenken.

Wie stellst du denn das Bild dar? Da gibt es (min.) 3 verschiedene Befehle.

Am besten könnte man dir anhand eines reproduzierbaren Beispiels helfen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Davaaron

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2016, 14:31     Titel:
  Antworten mit Zitat      
Ja das ist auch etwas irreführend...
die Bilder zeige ich mit imshow an.
Jetzt kann ich das Bild darstellen. Problem war, dass das Bild als uint8 reingeladen wird, ich aber die neuen Werte in double gespeichert habe.
Jetzt habe ich g_new explizit als uint8 definiert und jetzt funktioniert es.
Allerdings ist das Ausgangsbild exakt gleich mit dem Originalbild.

Aber ich denke, dass das logisch klingt, da die Werte nicht mehr groß gespreizt werden können, weil die g-range schon von 0-205 reicht.

Es sei denn eine Spreizung beinhaltet auch eine Maximierung des globalen Kontrasts. Denn dann wäre ich erst am Anfang..
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2016, 14:34     Titel:
  Antworten mit Zitat      
Hallo,

momentan nimmst du ja das min bzw. max über alle Elemente. Wäre es nicht sinnvoll, das nur auf die momentane Farbebene (also gg statt g) zu beziehen?

Vor allem sollten auch wirklich die Werte bis 255 ausgeschöpft werden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Davaaron

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2016, 14:39     Titel:
  Antworten mit Zitat      
Ich bin deinem Vorschlag nachgekommen und stehe jetzt hier:

Code:

I = imread(bild_in);
g=double(I);
[m,n,o] = size(g);
g_new = zeros(m,n,o);
w_min = 0;
w_max = 255;

for k=1Surprised
    gg= g(:,:,k);
    g_min = min(min(gg));
    g_max = max(max(gg));
    for i = 1:m
        for j = 1:n
            g_new(i,j,k) = (gg(i,j)-g_min)* ((w_max-w_min)/(g_max-g_min));
        end
    end
end
bild_out = uint8(g_new);
subplot(1,2,1);
imshow(I);
subplot(1,2,2);
imshow(bild_out);
end
 


Ich habe das Gefühl, dass nun das neue Bild etwas heller ist als das Original.
 
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 - 2025 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.