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

Bildrauschen

 

Nowak89
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 10:31     Titel: Bildrauschen
  Antworten mit Zitat      
Hallo,

ich möchte gerne ein Bildrauschen, ohne die imnoise Funktion erstellen.
Das Bild sollte eine bestimmte Anzahl an Pixeln (z.B. x% von der Gesamtpixelzahl) auswählen, und diesen einen neuen Farbwert (grau) zuordnen.
Ich weiß, dass es unterschiedliche Random Funktionen gibt, nicht aber, welche für mich relevant wäre. Außerdem habe ich keine Ahnung, wie ich im Anschluss das ausgewählte Pixel grau färben kann.

Vielen Dank
Grüße
Marc
Private Nachricht senden Benutzer-Profile anzeigen


Zacho

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 10:39     Titel:
  Antworten mit Zitat      
Hallo,

die einfachste Form von Rauschen erzeugst du mit dem Befehl: rand. Das Rauschmuster sind das bereits Grauwerte.

Zacho
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 10:49     Titel:
  Antworten mit Zitat      
Hallo,

ich würde gerne ein Bild haben, und dort x Pixel zufällige Grauwerte zuweisen. Die zufällig gewählte Pixel sollen also einen zufälligen Grauwert erhalten (z.B. zwischen 100 und 150).
Private Nachricht senden Benutzer-Profile anzeigen
 
Zacho

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 10:56     Titel:
  Antworten mit Zitat      
Das geht mit: X=randi([100 150],200,200); Dabei ist 200x200 die Bildgröße und die Werte liegen zwischen 100+150. Soll das nur in einem best. Bereich sein, dann musst du diesen Befehl auf einen Bildausschnitt anwenden.
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 11:07     Titel:
  Antworten mit Zitat      
Also mit folgendem Code bekomme ich nur ein weißes Bild. Ich würde gerne angeben können, wie viele Pixel grau werden sollen, und dies auf das Originalbild anwenden. Sorry, bin Neuling im Bereich Matlab und Bildverarbeitung.

Code:
J = imread('Image.png');
[rows, cols,~] = size(J);
X=randi([100 150],rows, cols);
imshow(X);
 


Dankeschön!

Edit: Es handelt sich um ein RGB Bild und das soll es auch weiterhin bleiben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 11:50     Titel:
  Antworten mit Zitat      
Ich habe etwas hinbekommen mit folgendem Code. Allerdings funktioniert dies nur für 1-Kanal Bilder. Bei RGB Bildern werden die Pixel nicht grau, sondern farbig dargestellt.

Code:
J = imread('image.png');
d = 10000;
x = randi(numel(J), 1, d);
J(x) = randi([100 150], [numel(x) 1]);
imshow(J);
Private Nachricht senden Benutzer-Profile anzeigen
 
Zacho

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 12:31     Titel:
  Antworten mit Zitat      
Das ist auch logisch. Das Rasuchen wird in jedem Farbkanal unterschiedlich dargestellt. Somit ensteht farbiges Rauschen. Du musst dafür sorgen, dass das Rausch pro Kanal identisch ist. Also das Farbbild in RGB zerlegen, einmal Rauschen erzeugen und diese Werte auf jeden Farbkanal übertragen. Ein Rauschwert von z.B. R=50, G=50,B=50 ergibt im Farbbild einen grauen Wert.
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 13:12     Titel:
  Antworten mit Zitat      
Hallo,

also das Farbbild in die einzelnen Kanäle erreiche ich durch
Code:
R=J(:,:,1);
G=J(:,:,2);
B=J(:,:,3);


Das Rauschen kann ich wie folg erzeugen.
Code:
d=1000;
x = randi(numel(J), 1, d);
J(x) = randi([100 150], [numel(x) 1]);


Aber wie kann ich dies für jeden Kanal gleich erreichen? Mir ist klar, dass der Grauwert durch identische R, G und B Werte erreicht wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
Zacho

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 14:34     Titel:
  Antworten mit Zitat      
Du hast jetzt R,G + B. Jeder Auszug verhält sich wie eine m*n-Matrix, also gleich einem S/W Bild. Das Rauschen darf nur 1x erzeugt und dann auf R,G + B übertragen werden. Auf die Farbauszüge muss immer die gleiche Variable angewendet werden. Randi darf nicht jedesmal neu gestartet werden. Dann alle Farbauszüge wieder zu einem Bild zusammenfügen.
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 15:23     Titel:
  Antworten mit Zitat      
Hallo Zacho,

vielen Dank erst einmal für Deine Unterstützung.
Ich habe das Prinzip verstanden, nur komme ich mit der Umsetzung nicht klar.
Bild in R,G,B aufspalten
Code:
R=J(:,:,1);
G=J(:,:,2);
B=J(:,:,3);


Die Zufallswerte erzeuge ich weiterhin mit
Code:
d = 10000;
x = randi(numel(J), 1, d);
J(x) = randi([0 15], [numel(x) 1]);


Das Bild neu zusammenführen funktioniert meines Wissens mit
Code:
I=cat(3,R,G,B);


Nur wie (oder mit was) kann ich die Zufallswerte in R,G,B schreiben?

Muss ich eventuell die Zufallswerte von Rot erzeugen, und die irgendwie auf G und B mappen?

Entschuldige bitte mein Unwissen, aber als Neuling tut man sich da etwas schwer mit...
Private Nachricht senden Benutzer-Profile anzeigen
 
Zacho

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2015, 08:18     Titel:
  Antworten mit Zitat      
Das Problem schien mir in der Theorie schnell gelöst, zeigt sich in der Praxis aber deutlich schwieriger. Grundsätzlich ist es ja richtig, dass graue Rauschwerte in allen Farbkanälen den gleichen Betrag haben müssen, damit sie innerhalb eines Fabbbildes grau erscheinen.
Sind die Rauschwerte in der Anzahl jedoch so hoch, dass jedes Pixel belegt ist, kann sich kein Farbbild mehr durchsetzen. Es müssen also in x/y-Richtung eine Reihe von Koordinaten festgelegt werden, damit die Originalwerte auf Grau indiziert werden können.
Dazu ein einfacher Versuch:

Code:
a=im2uint8(rand(10,10,3));
imshow(a)
a(3,3)=10;  
a(3,4)=30;
a(5,8)=60;
figure; imshow(a)

Jetzt hast du ein Farbbild mir grauen Rauschwerten. Das Beispiel zeigt auch, was zu tun ist. Nämlich eine Anzahl von Koordinaten und die dazugehörigen Grauwerte zu bestimmen. Randi passt dann doch nicht, da alle Pixel zu Rauschwerten werden.

Wenn ich eine Lösung gefunden habe, werde ich mich wieder melden.
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2015, 11:31     Titel:
  Antworten mit Zitat      
Hallo Zacho,

vielen Dank für deine Unterstützung. Ich dachte mir schon, dass das nicht so leicht wird.
Durch mein Randi habe ich doch nicht in jedem Pixel ein Rauschen. Durch meine Variable d kann ich festlegen, wie viele Pixel (zufällig verteilt) Rauschen aufweisen sollen. Ich muss jetzt "nur noch" das Rauschen in allen Kanälen auf die gleichen Pixeln in gleichem Ausmaß anwenden.

Grüße
Marc

Edit:
Vielleicht ist es möglich, das Bild in ein 1-Kanalbild zu konvertieren, das Rauschen erzeugen und alle unveränderten Pixel wieder zu einem 3-Kanalbild zu konvertieren und die veränderten Pixeln zu übernehmen bzw. diesen Wert in die RGB Werte zu schreiben?
Private Nachricht senden Benutzer-Profile anzeigen
 
Zacho

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2015, 13:36     Titel:
  Antworten mit Zitat      
Mal folgender Vorschlag:

Code:
I=imread(Bild);
A=uint8(zeros(1024,1024);  % Passt zum Bild oben
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
d=1000;
x=randi(numel(A),1,d);
A(x)=randi([100 150],[numel(x),1]);
R1=imabsdiff(A,R);
G1=imabsdiff(A,G);
B1=imabsdiff(A,B);
Res=cat(3,R1,G1,B1);
imshow(Res)


Versucht wird, das Rauschen in Matrix A auf alle Farbauszüge zu übertragen.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.10.2015, 22:04     Titel:
  Antworten mit Zitat      
Hallo,

Zachos Vorschlag kann man noch mit "linear indexing" vereinfachen:

Code:
Img = imread(Bild);
res = size(Img, 1) * size(Img, 2);

nPixel = 1000;
index = randi(res, 1, nPixel);
value = randi([100, 150], [nPixel, 1]);

Img(index)               = value;
Img(index + res)      = value;
Img(index + 2 * res) = value;

Das ist zwar effizient und kurz, aber ich finde es unübersichtlich. Deshalb gehören klare Kommentare in den Code.

Die Idee dahinter ist die:
Ein Array der Größe [64 x 44 x 3] wird im Speicher genauso abgelegt wie ein Vektor der Größe [1 x 64*44*3]. Beim Indizieren erlaubt Matlab entweder die 3 Indices zu verwenden, oder aber das Array so zu indizieren, als wäre es ein Vektor. Zur Untermatrix Img(:, :, 2) gelangt man also auch, indem man zu den Indizes 64*44 hinzu addiert.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2015, 09:04     Titel:
  Antworten mit Zitat      
Hat soweit super funktioniert. Danke euch allen Smile
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.