Verfasst am: 25.10.2011, 22:38
Titel: Wie Bildpixel auswählen und Farbe/Wert ändern?
Hallo,
ich suche nach einer Möglichkeit bei einem eingelesenen Bild die mittleren Pixel anzusteuern und deren Farbwerte zu ändern.
Leider kann ich dazu nirgendwo etwas finden.
Vielen Dank für Hilfe!
Weiterhin hätte ich die Frage wieso eine fft2 aus ImageJ komplett anders in MatLab ausschaut, bzw in MatLab scheinen die Ergebnisse keine einfachen "2D"Bilder zu sein, in ImageJ schon, stimmt das?
Habe folgenden Code gefunden, aber ich möchte nur den Grauwert ändern und komme deswegen nicht weiter...
Code:
I=imread('cameraman.tif');
I2=repmat(I,[113]);
R=I2(:,:,1);
G=I2(:,:,2);
B=I2(:,:,3);
I3=cat(3,R,G,B);
I3(30,30,1)=255; % Lage des Pixels (30,30) und 1. Farbe
I3(30,30,3)=255; % Lage des Pixels (30,30) und 2. Farbe = Rot figure; imshow(I3)
Verfasst am: 25.10.2011, 23:56
Titel: Re: Wie Bildpixel auswählen und Farbe/Wert ändern?
Hallo MisterKnister
Was genau bedeutet "Pixel ansteuern"?
Ich weiß nicht, was ImageJ ist und wie es eine fft2 berechnet.
Welche Ergebnisse scheinen in Matlab keine "einfachen 2D-Bilder" zu sein, und was sind 2D-Bilder?
Der gepostete Code zerlegt ein 3D-Array zunächt in 3 2D-Arrays und setzt sie dann wieder zusammen. I2 und I3 sind also identisch.
Es wird nicht klar, was Deine Inputs sind und was Du berechnen möchtest. RGB-JPEGs werden in Matlab in [Weite x Höhe x 3] Arrays eingelesen. Mit RGB2GRAY wandelt man sie in ein Graustufenbild um. Solche Details werden ausgiebeig in den Getting Startet Kapiteln der Dokumentation erklärt.
Verfasst am: 26.10.2011, 00:19
Titel: Re: Wie Bildpixel auswählen und Farbe/Wert ändern?
Hallo,
also das Bild wurde eingelesen in Grauwerte umgewandelt,
danach eine fft2 gemacht und nun soll in diesem Ergebnis
die Mitte (also die mittleren Pixel) zB in den "Grauwert 0" geändert werden.
Sozusagen die Pixel um den Wert (m/2, n/2).
Danach soll das Bild wider per ifft2 zurückgerechnet werden.
wegen des letzten Abschnittes, ich habe mich die letzten Wochen versucht einzulesen, und habe viel getting startet durchgearbeitet, leider werden dort scheinbar nie die Sachen erwähnt die ich benötige
aber die genannten "Sachen" sind soweit klar, aber danke!
ImageJ ist auch ein "Bildbearbeitungsprogramm" um zB Histogramme oder FFTs etc anzufertigen.
Letztere sehen dort "benutzbar und durchschaubar" aus... so wie auch auf einschlägigen Seiten beschrieben.
In MatLab erhalte ich aber leider immer nur "WirrWarr" als FFT und kann damit nichts anfangen
Wegen den nicht "einfachen 2D Bildern":
Ich erhalte immer Fehler ("zu komplexe werte") wenn ich Histogramme eines Bilders machen will,
egal in welches Format ich konvertiere (uint8,...)
Ich hoffe ich konnte mein Anliegen nun etwas genauer beschreiben?
Verfasst am: 26.10.2011, 00:39
Titel: Re: Wie Bildpixel auswählen und Farbe/Wert ändern?
Hallo MisterKnister,
Zitat:
also das Bild wurde eingelesen in Grauwerte umgewandelt,
danach eine fft2 gemacht und nun soll in diesem Ergebnis
die Mitte (also die mittleren Pixel) zB in den "Grauwert 0" geändert werden.
Sozusagen die Pixel um den Wert (m/2, n/2).
Danach soll das Bild wider per ifft2 zurückgerechnet werden.
Welches ist "der letzte Abschnitt", der noch nicht funktioniert?
Matlab liefert mathematisch korrekte Antworten in Arrays, die das zu erwartende Format haben. Was daran "WirrWarr" ist, müsstest Du noch genauer beschreiben.
In einem Forum ist folgende Strategie effizient:
1. Poste den Code, der die Probleme erzeugt.
2. Wenn es eine Fehlermeldung gibt, kopiere sie genau. Die Fehlermeldungen von Matlab enthalten wertvolle Hinweise für die Lösung des Problems.
Wenn wir weder Code noch Fehlermeldung kennen, können wir nur mutig raten. Dass ist aber in 99% der Fälle mehr verwirrend als hilfreich.
Zitat:
Ich erhalte immer Fehler ("zu komplexe werte") wenn ich Histogramme eines Bilders machen will,
egal in welches Format ich konvertiere (uint8,...)
Wieso geht es plötzlich um Histogramme? Was genau konvertierst Du in welches Format?
Versuchst Du ein Histogramm einer Matrix mit komplexen Zahlen zu erstellen?
Soweit funktionierte das auch, aber es fehlt eben das gewünschte Pixelwertabändern.
Alles andere ist erstmal nicht so wichtig =)
(Zum Histogramm: Das waren Übungen und Spielereien zum Einarbeiten,
welche ohne Fehlermeldung hätten klappen sollen, aber gerade nicht so wichtig sind)
Auf jeden Fall schonmal vielen Dank dir für die schnellen Antworten!
dein Anfangsproblem kann ich noch verstehen, du mußt nur die 3. Farbe dazunehmen, dann hast du wieder grau.
Zitat:
Habe folgenden Code gefunden, aber ich möchte nur den Grauwert ändern und komme deswegen nicht weiter...
In diesem Zusammenhang redest Du von "mittleren Pixeln", was meinst Du damit und wie sind die "mittleren Pixel" nach der fft zu verstehen. Willst du im FFT-Bild im Centrum einen Bereich auf "0" setzen, dann mußt die Koordinaten für den auf "0" zu setzenden Bereich angeben, ähnlich:
Fehlermeldung gibt es mal keine für mehrere Bilder.
Das Testbild hatte 512x512 Pixel.
Nun aber folgendes Problem:
Die FFT sieht leider immer noch nicht "anschaulich" aus.
fft2shift gibt es leider nicht, und somit wird in der Bildmitte keine Zentrierung wie ich mir das vorstelle gemacht.
Gibt es dazu eine Lösung?
Ist überhaupt verständlich was ich meine, oder soll ich mal Beispielbilder machen wie es aussehen soll (ImageJ->Process->FFT ergibt ein symmetrisches Bild mit Spiegelung Hor/Ver im Mittelpunkt) zu dem wie es in Matlab ausschaut ("Schneesturm in alaska")?
ist deutlich die Funktion fftshift sichtbar. Ist das vielleicht kein zus. Befehl sondern wird in einem Abwasch mit fft2 gemacht?
Sonst nimm einfach den Bereich der äußeren Ecken nach fft2 und setze jeweils mit 1/4 des Bereichs die Werte auf 0. Wenn der Bereich nicht quadratisch ist, müssen es eben der 4. Teil des Rechtecks sein. fftshift ist ja nur eine andere Darstellung.
Noch ein paar Anmerkungen zu deinem Besipiel. Wenn du ein Grauwertbild einliest brauchst du den Befehl rgb2gray nicht oder es ist kein Graubild. Man kann natürlich auch "Graubilder" als RGB-Bilder laden.
Beim Speichern von *.jpg kannst du auch noch die Komprimierung angeben:
ist deutlich die Funktion fftshift sichtbar. Ist das vielleicht kein zus. Befehl sondern wird in einem Abwasch mit fft2 gemacht?
Sonst nimm einfach den Bereich der äußeren Ecken nach fft2 und setze jeweils mit 1/4 des Bereichs die Werte auf 0. Wenn der Bereich nicht quadratisch ist, müssen es eben der 4. Teil des Rechtecks sein. fftshift ist ja nur eine andere Darstellung.
fftshift hat sich erledigt, da der befehl in einer alten versin wohl als fft2shift, statt fftshift beschrieben wurde, jedenfalls hatte ich da wohl einen falschen oder alten Thread gefunden im netz.
Aber mit fftshift funktionierts wie gewünscht scheinbar.
Zitat:
Noch ein paar Anmerkungen zu deinem Besipiel. Wenn du ein Grauwertbild einliest brauchst du den Befehl rgb2gray nicht oder es ist kein Graubild. Man kann natürlich auch "Graubilder" als RGB-Bilder laden.
Beim Speichern von *.jpg kannst du auch noch die Komprimierung angeben:
Damit wäre das Threadproblem gelöst,
nochmals vielen vielen Dank euch!
Ich hätte jetzt eine weitere Überlegung.
Ist es möglich, dass man statt die Pixel anzuwählen,
Bereiche durch symmetrische Figuren beschreibt?
Sozusagen: "ordne einen Kreis mit Radius r um Pixel (x/y) dem Wert a zu"?
Und kann man den Bildmittelpunkt mathematisch beschreiben?
zB wenn man bei einem Bild mit Breite m und Höhe n den Mittelpunkt bzw eine bestimmte Pixelbreite darum bestimmen möchte dies durch m/2 +/- 3 Pixel bis n/2 +/- 3Pixel statt bei einem Bild von 200x200 dies durch 97:103,97:103 umzuformulieren?
Ich hoffe es ist ok wenn ich dies noch hier Frage, da eigentlich die Hauptfrage geklärt ist, oder soll ich dazu ein neues Thema eröffnen?
I=imread('bild.jpg'); %Grauwert Bild einlesen
I2=rgb2gray(I); %Ohne kam eine Fehlermeldung
F=fft2(I); %Discrete Fourier Transform
F3=fftshift(F); %Zero-Frequency Komponente zentrieren
F4=log(abs(F3)+1); %Zur Darstellungsverbesserung
figure; imshow(F4,[])% Anzeige imwrite(F4,'bild2.jpg','Quality',100); %Speichern des Powerspektrums
F4(450:462,684:696)=0; %Grauwerte des Bildes an den mittigen
%Pixelstellen um m/2,n/2 dem Wert 0 zuordnen
imwrite(F4,'bild3.jpg','Quality',100); %Speichern des veränderten Powerspektrums
G=ifft2(F5); %Rückumwandlung aus dem Powerspektrum
imwrite(G,'bildfinal.jpg','Quality',100); %Speichern des Endergebnisses
figure; imshow(G) %Visualisierung des Endergebnisses
Mit diesem "imshow" Befehl, kommt genau das heraus was ich sehen möchte, allerdings wird dieses angezeigte Bild nicht beim "Pixel bemalen" benutzt.
Im Endeffekt bekomme ich aber nur ein weißes Bild, und habe die ausgewählten Pixel schwarz bemalt, wodurch dann natürlich ein komplett schwarzes Endbild resultiert.
Somit stellt sich für mich die Frage wie ich diese Skalierung die Matlab beim Anzeigen vornimmt, von Hand einfügen kann, damit ich damit weiterrechnen kann.
Vielen Dank im Voraus!
Sorry, aber das verstehe ich nicht oder es ist noch zu früh. Was verstehtst du unter "Pixel bemalen"? Wie du die Pixelfarbe ändern kannst, hast du doch in deiner Eingangsfrage beschrieben. Um Farbe darzustellen mußt du durchgängig in einer m*n*3-Matrix bleiben oder nachträglich wandeln. Du kannst unter m*n nur SW darstellen oder als Index über colormap. Bleib doch einfach beim Einlesen eines Farbbildes - ohne rgb2gray.
Wenn du die Pxelfarbe ändern willst, mußt du, wie selbst beschrieben, das Bild in die Layer zerteilen und max. 2 Werte ändern.
Weiterhin ist mir nicht ganz klar, ob du die Farbe in der FFT ändern willst, was eigentlich keinen Sinn macht. An der Stelle wo du hängst würde ich die Farbdarstellung nicht ändern.
Das macht eigentlich nur Sinn, wenn man periodische Störungen in einem Farbbild so genau abstimmen will, dass die Umgebung der Störung den Farbwerten angepaßt sein soll.
Weiterhin ist mir nicht ganz klar, ob du die Farbe in der FFT ändern willst, was eigentlich keinen Sinn macht. An der Stelle wo du hängst würde ich die Farbdarstellung nicht ändern.
Ist das möglich?
Also in der FFT will ich den Grauwert ändern, um damit "den Filter durchlässig bzw undurchlässig" zu machen.
edit:
Hier habe ich etwas gefunden, was ähnlich klingt vom imshow(X,[]) Befehl her: http://www.gomatlab.de/viewtopic.ph.....highlight=&setbm=true
Aber ich muss zugeben, dass ich damit nichts anfangen kann, also nicht wüsste wie mir dies weiterhelfen könnte.
Es geht so vieles. Aber was hat diese Frage jetzt mit den vorangegangen Fragen zu tun? Suchst du einen Filter für die FFT oder willst du Pixelfarben ändern?
edit:
Ich habe die Antwort vor deinem Edit geschrieben. Bei einem Filter in der FFT werden die Frequenzbereiche eingegeben die gesperrt werden sollen, Dazu mußt du nicht noch vorher die Pixelwerte ändern. Frequenzfilter für Matlab hat Google.
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.