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
Zacho
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.10.2015, 09:39
Titel:
Hallo,
die einfachste Form von Rauschen erzeugst du mit dem Befehl: rand. Das Rauschmuster sind das bereits Grauwerte.
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).
Zacho
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.10.2015, 09:56
Titel:
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.
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.
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.
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.
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.
Zacho
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.10.2015, 13:34
Titel:
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.
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...
Zacho
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.10.2015, 07:18
Titel:
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:
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.
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?
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.
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.