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

Wie Bildpixel auswählen und Farbe/Wert ändern?

 

MisterKnister
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.10.11
Wohnort: ---
Version: 7.12.0 (R2011a)
     Beitrag Verfasst am: 25.10.2011, 23:38     Titel: Wie Bildpixel auswählen und Farbe/Wert ändern?
  Antworten mit Zitat      
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,[1 1 3]);
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)
 
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.10.2011, 00:56     Titel: Re: Wie Bildpixel auswählen und Farbe/Wert ändern?
  Antworten mit Zitat      
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MisterKnister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.10.11
Wohnort: ---
Version: 7.12.0 (R2011a)
     Beitrag Verfasst am: 26.10.2011, 01:19     Titel: Re: Wie Bildpixel auswählen und Farbe/Wert ändern?
  Antworten mit Zitat      
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 Sad
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 Sad

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.10.2011, 01:39     Titel: Re: Wie Bildpixel auswählen und Farbe/Wert ändern?
  Antworten mit Zitat      
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?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MisterKnister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.10.11
Wohnort: ---
Version: 7.12.0 (R2011a)
     Beitrag Verfasst am: 26.10.2011, 02:03     Titel: Re: Wie Bildpixel auswählen und Farbe/Wert ändern?
  Antworten mit Zitat      
Hallo,
also ich habe folgendes bisher:

Code:

I=imread('abc.jpg');     %Grauwert Bild einlesen
I2=rgb2gray(I);          
F=fft2(I2);                   %Fourier Transform
F2=F1                         %Kopie

%Jetzt sollen die Grauwerte des Bildes an den Pixel stellen m/2,n/2
%also genau in der Bildmitte dem Wert 0 bzw 255 zugeordnet werden

G=ifft2(F2);
imwrite(G,'abc2.jpg');
imshow(G)
 


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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 26.10.2011, 07:02     Titel:
  Antworten mit Zitat      
Moin MisterKnister,

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:

Code:
I2(131:141,116:131)=0;


für Colorbilder:

Code:
I2(131:141,116:131,:)=0


Normalerweise fehlt noch der Befehl "fftshift" vor fft2.

Viele Grüße

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
MisterKnister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.10.11
Wohnort: ---
Version: 7.12.0 (R2011a)
     Beitrag Verfasst am: 27.10.2011, 01:12     Titel:
  Antworten mit Zitat      
Hi,
super vielen Dank für deine Hilfe!
Genau das hatte ich gesucht (und obwohl es so einfach scheint nicht gefunden).

Habe das ganze nun wie folgt ergänzt:
Code:

I=imread('weiß.jpg');     %Grauwert Bild einlesen
I2=rgb2gray(I);          
F=fft2(I2);                   %Fourier Transform
F2=F;                          %Kopie
F3=fftshift(F);               %Zero-Frequency Komponente zentrieren

F3(223:229,223:229)=0;        %Grauwerte des Bildes an den mittigen
                              %Pixelstellen um m/2,n/2 dem Wert 0 zuordnen

F4=ifftshift(F3);             %Rückgängigmachen des fftshift Befehls                
                             
G=ifft2(F4);                  %Rückumwandlung aus dem Powerspektrum
imwrite(G,'weiß2.jpg');       %Speichern des Endergebnisses
imshow(G)                     %Visualisierung des Endergebnisses
 


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")?
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 27.10.2011, 07:01     Titel:
  Antworten mit Zitat      
Moin,

die Darstellung der FFT läßt sich verbessern:

Code:
F3=log(abs(F3)+1);
figure; imshow(F3,[])


Was meinst du damit, dass Imagej kein fftshift hat oder habe ich dich falsch verstanden? Auf der Seite:

http://imagejdocu.tudor.lu/doku.php?id=gui:process:fft

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:

Code:
.....,'Quality',100)
Private Nachricht senden Benutzer-Profile anzeigen
 
MisterKnister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.10.11
Wohnort: ---
Version: 7.12.0 (R2011a)
     Beitrag Verfasst am: 29.10.2011, 18:05     Titel:
  Antworten mit Zitat      
Hubertus hat Folgendes geschrieben:
Moin,

die Darstellung der FFT läßt sich verbessern:

Code:
F3=log(abs(F3)+1);
figure; imshow(F3,[])


Vielen, vielen Dank! Genau das war es =)

Zitat:
Was meinst du damit, dass Imagej kein fftshift hat oder habe ich dich falsch verstanden? Auf der Seite:

http://imagejdocu.tudor.lu/doku.php?id=gui:process:fft

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:

Code:
.....,'Quality',100)


Vielen Dank für den Tipp! werde ich so machen.

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2011, 23:28     Titel:
  Antworten mit Zitat      
Hallo MisterKnister,

Ja, bitte starte einen neuen Thread.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MisterKnister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.10.11
Wohnort: ---
Version: 7.12.0 (R2011a)
     Beitrag Verfasst am: 03.11.2011, 03:32     Titel:
  Antworten mit Zitat      
Code:

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
                                       
F5=ifftshift(F4);                       %Rückgängigmachen des fftshift Befehls                


G=ifft2(F5);                                  %Rückumwandlung aus dem Powerspektrum
imwrite(G,'bildfinal.jpg','Quality',100);    %Speichern des Endergebnisses
figure; imshow(G)                             %Visualisierung des Endergebnisses
 



Ich dachte das Problem sei gelöst, allerdings hänge ich an der stelle:

Code:
F4=log(abs(F3)+1);                      %Zur Darstellungsverbesserung

figure; imshow(F,[])  


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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 03.11.2011, 05:53     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 03.11.2011, 09:23     Titel:
  Antworten mit Zitat      
Nachtrag:

Es geht natürlich auch das:

Code:
F3(131:141,116:131,:)=zeros(11,16,3)
% wobei 3 ein vergrauter Farbwert ist.

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
MisterKnister
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.10.11
Wohnort: ---
Version: 7.12.0 (R2011a)
     Beitrag Verfasst am: 03.11.2011, 11:08     Titel:
  Antworten mit Zitat      
Hubertus hat Folgendes geschrieben:


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.


Guten Morgen!
Ja genau, ich will den Wert in der FFT ändern.
Habe hier etwas gefunden, was es recht gut an den Beispielbildern verdeutlicht:
http://imagejdocu.tudor.lu/doku.php?id=gui:process:fft#fft

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 03.11.2011, 11:31     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.