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

Unschärfeverlauf erzeugen

 

Melo_90
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 18.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.10.2016, 21:07     Titel: Unschärfeverlauf erzeugen
  Antworten mit Zitat      
Guten Abend,

ich würde gerne Folgendes realisieren. Durch den Code unten generiere ich einen Tropfen, siehe linkes Bild. In diesem Tropfen möchte ich nun den Tropfenkern, der im linkes Bild 1 Pixel groß ist, größer darstellen, sprich einen Tropfenkerndurchmesser angeben können. Der Tropfenkern selbst ist gänzlich weiß (Wert: 255). Ausgehend vom Rand dieses Tropfenkerns würde ich gerne bis zum Matrixrand einen (linearen) Abfall vom Wert 255 bis zum Wert 0 erhalten der einer Funktion folgt (linear, quadratisch, etc.). Aktuell kommt das rechte Bild raus. Da komme ich aber nicht weiter. Noch mal die einzelnen Punkte:

-Tropfenkerndurchmesser: d_drop
-(vorerst) linearer Unschärfeverlauf ausgehend vom Tropfenkernrand bis zum Matrixrand (immer von 255 bis 0)
-Gesamttropfen soll in der Matrix stets mittig angeordnet sein

Hier der Code (rechter Tropfen):

Code:
n = 101
II = zeros(n); %Matrix mit Nullen

%Angaben
d_drop = 10; %Zahl muss ungerade sein damit kein Quadrat entsteht
coeff = 0.8; %Helligkeitsverlauf der Unschärfe

%Erzeugung des Farbverlaufs
for i=1:n
    for j=1:n
        rad_dis = sqrt((i-round(n/2))^2+(j-round(n/2))^2);
        if rad_dis < d_drop/2
            II(i,j,:) = 0; %Farbwert des Tropfenkerns (fix)
        elseif rad_dis > n/2
            II(i,j,:) = 1; %Farbwert des Hintergrunds (fix)
        else
            II(i,j,:) = coeff+((rad_dis/n)-1); %Funktionsverlauf der Unschärfe XXX
        end
    end
end

II = uint8(255*(II/min(II(:,1))));
II = imcomplement(II); %Invertierung der Matrix
imshow(II)
axis on


Ein Beispielbild ist beigefügt. So wie im rechten Bild soll der Tropfen auch ungefähr aussehen, das ist aktuell aber eher noch Zufall das der so raus kommt. Mit dem Funktionsverlauf komme ich auch auf keinen grünen Zweig.

Vielen Dank im Voraus Smile

Gruß

untitled.jpg
 Beschreibung:

Download
 Dateiname:  untitled.jpg
 Dateigröße:  171.85 KB
 Heruntergeladen:  329 mal
Private Nachricht senden Benutzer-Profile anzeigen


Melo_90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 18.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2016, 17:24     Titel:
  Antworten mit Zitat      
Keiner eine Idee bzw. fehlen Informationen?

Gruß
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: 16.10.2016, 00:36     Titel:
  Antworten mit Zitat      
Hallo Melo_90,

Bitte bumpe eine Frage frühestens nach 24 Stunden, siehe http://www.gomatlab.de/der-kleine-g.....b-de-knigge-t125.html#233.
Fragen sollen immer nur einmal gepostet werden, und nicht mehrfach in verschiedenen Kategorien.
Danke!

Zitat:
d_drop = 10; %Zahl muss ungerade sein damit kein Quadrat entsteht

10 ist aber gerade.

Was ist genau Deine Frage? Du hast den Radius gegeben und möchtest eine Funktion dazu erstellen, die linear, quadratisch bzw. "etc" abfällt.
Wenn der Tropfen in der Mitte rund ist, kann er nicht linear bis zum Rand abfallen und auf dem Rand 0 erreichen, da der Rand quadratisch ist. Insofern ist die Aufgabe bisher unlösbar.

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Melo_90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 18.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2016, 14:21     Titel:
  Antworten mit Zitat      
Hallo,

wusste ich nicht. Werde ich beim nächsten Mal beachten Smile.

Ich glaube ich verstehe, wo das Problem liegt. Vllt. habe ich das falsch formuliert. Linear kann er bis zum Matrixrand in der Zeile abfallen, die durch den Mittelpunkt geht. Bei den anderen Zeilen ist es klar, dass er das dort nicht kann, da man sonst als Tropfen ein Rechteck erhalten würde.

Korrektur: Der Tropfen soll ausgehend vom Tropfenkernrand bis zum Gesamttropfenrand linear abfallen, wobei ich stets den Durchmesser des Gesamttropfens betrachte.

Eine lineare Funktion ist erstmal ausreichend (quadratisch, etc. ist aktuell unwichtig). Die Frage ist wie ich das realisieren kann. Hier noch der Code wie ich einen Tropfen erzeuge so wie ich ihn haben will, nur eben ohne die Größe des Tropfenkerns vorgeben zu können.
Code:
gv_numb = 50; %Anzahl an Graustufen (angefangen beim Zentrum bis zum Rand, also gv_numb+1)
[x,y] = meshgrid(-1:1/gv_numb:1,-1:1/gv_numb:1); %Aufspannen eines Netzes
rad_dis = sqrt(x.^2+y.^2); %radiale Verteilung

%Erzeugung des Farbverlaufs
I = uint8(255*(rad_dis/min(rad_dis(:,1))));
I = imcomplement(I); %Invertierung der Matrix

%Erstellung der Figur und der Subplots
imshow(I)


Gruß
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: 22.10.2016, 12:33     Titel:
  Antworten mit Zitat      
Hallo Melo_90,

Berechne zunächst den Radius für jeden Pixel. Die meshgrid Methode ist dafür schon mal gut. Danach benötigst Du eine "lineare Transformation", die eigentlich ziemlich einfach ist: Du musst nur eine Konstante vom Radius-Wert abziehen und mit einem zweiten Konstanten multiplizieren. Wenn der Radius innerhalb eines gewissen Kreises zum gleichen Funktionswert führen soll, benötigst Du noch ein max dazu:
Code:
V = (radius - a)*b;
I = max(1, 1 / V);  % Umrechnung in Pixel-Intensität

Die beiden Konstanten a und b bekommst Du am besten mit Bleistift und Papier heraus. Das sind zwei Gleichungen mit zwei Unbekannten: Welchen Wert soll ein Punkt am äußeren Rand haben, und welchen im Mittelpunkt, bzw. auf dem Rand des Tropfens.

Das entspricht genau dem, was Du im ersten Post mit "coeff+((rad_dis/n)-1" schon getan hast, wenn man die Terme ein wenig umstellt.

Ich nehme an, das Du schon mal zwei Gleichungen mit zwei Unbekannten gelöst hast. Wenn nicht, frage nochmal speziell nach. Für eine quadratische Abnahme muss man nur noch einmal zusätzlich quardieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2025 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.