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.
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
Davaaron
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 10.05.2016, 14:13
Titel:
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:
for k=1
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.
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
Davaaron
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 10.05.2016, 14:31
Titel:
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..
Ich habe das Gefühl, dass nun das neue Bild etwas heller ist als das Original.
Einstellungen und Berechtigungen
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
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.