Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Softwareentwickler (m/w) für automatische Codegenerierung
Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink im Bereich Fahrwerkregelsysteme
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Entwicklungsingenieur (m/w) für modellbasierte Softwareentwicklung
Modellbasierte Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Ingenieur (w/m) modellbasierte Entwicklung / Embedded Programmierung
Organisation und Durchführung von Projekten zur Integration von TargetLink in aktuelle Entwicklungsprozesse
dSPACE GmbH - Pfaffenhofen

Application Engineer (m/w)
Unterstützung des Vertriebs bei der Erstellung von Angeboten und Präsentation beim Kunden
Control Techniques GmbH - Hennef

Entwicklungsingenieur (m/w) für Fahrdynamikregelsysteme
Entwicklung der für die Fahrdynamik relevanten Funktionen
Elektronische Fahrwerksysteme GmbH - Ingolstadt

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Alpha-Compositing von ImageMagick's CopyOpacity emulieren

 

gubach
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2017, 14:32     Titel: Alpha-Compositing von ImageMagick's CopyOpacity emulieren
  Antworten mit Zitat      
Ich versuche die Funktionalität eines Alpha-Compositings (genauer: CopyOpacity von ImageMagick) in Matlab zu emulieren. Ziel ist es, eine Region, deren Kanten starke Treppen-Effekte (Aliasing) zeigt, aus einem Vordergrundbild FG auszumaskieren (die beiden Bereiche in Schwarz in den Bildern des Albums https://www.flickr.com/photos/gbachelier/albums/72157677436918822)
Dies soll mit einer Graustufenmaske geschehen, bei der zu entfernende Bereiche schwarz und zu erhaltende Bereiche weiß sind. Durch einen grauen Übergang zwischen diesen Bereichen soll ein kontinuierlicher Übergang zwischen vollständiger Transparenz und undurchsichtigem Vordergrund erreicht werden. Beispiel einer solchen Maske siehe https://www.flickr.com/photos/gbachelier/32703792336/

In ImageMagick (bzw. PerlMagick siehe folgender Code) wird dies mit dem Compose-Typ CopyOpacity erreicht:
$FG->Composite(image=>$Mask, compose=>'CopyOpacity', gravity=>'Center', color=>'transparent', matte=>'false');
Es ergibt sich ein FG, bei dem die vorher schwarzen Regionen transparent sind mit einem kontinuierlichen Übergang zu den undurchsichtigen Bereichen (siehe Screenshot mit Transparenz https://www.flickr.com/photos/gbachelier/32703794336)
Ein solches Bild mit Transparenz soll dann über ein Hintergrundbild BG kopiert werden, was in PerlMagick mit dem Compose-Typ Over geschieht:
$BG->Composite(image=>$FG, compose=>'Over', gravity=>'Center', color=>'transparent', matte=>'false');

Wie ein kontinuierlicher Übergang ohne Treppen-Effekte aussehen soll, sieht man in den Bildern, die mit ImageMagick nachbearbeitet wurden, und die als Zielvorgabe für ein reines Matlab-Verfahren dienen sollen https://www.flickr.com/photos/gbachelier/albums/72157679935822485

Zwei Versuche in Matlab ein Vordergrundbild FB mit einem Hintergrundbild BG unter Verwendung einer Graustufenmaske direkt zu verbinden ohne den Zwischenschritt analog zu CopyOpacity funktionieren nicht wie gewünscht:
Code:
FG = uint8(CM_mask_blur_alpha .* FG + (1 - CM_mask_blur_alpha) .* BG);

Hierbei wird die Graustufenmaske wie eine binäre Maske verwendet mit entsprechend harten und Treppen-Kanten, d.h. es kommt zu unakzeptablen Aliasing-Effekten https://www.flickr.com/photos/gbachelier/albums/72157679863538505

Code:
FG = uint8(bsxfun(@times, CM_mask_blur_alpha, FG) + bsxfun(@times, (1 - CM_mask_blur_alpha), BG));
 

Hierbei kann man zwar einen gewissen Alpha-Effekt sehen, bei dem das Hintergrundbild in der Kantenregion durchscheint. Besser als die vorherige Version, doch es sind immer noch unakzeptable Treppen-Kanten des Vordergrundes zu sehen https://www.flickr.com/photos/gbachelier/albums/72157676484696303

Da anscheinend eine direkte Verrechnung mit einer Graustufenmaske nicht funktioniert, suche ich nach einer Möglichkeit, Bilder mit Alpha-Transparenz in Matlab zu erzeugen analog zu CopyOpacity, die dann über ein anderes Bild gelegt werden. Dies ist eine ähnliche Problemstellung wie in http://stackoverflow.com/questions/.....and-blending-with-another, aber es passt nicht direkt wegen fehlender Graustufenmaske und ich konnte Lösungselemente auch nicht anpassen (z.B. Antwort 1: Erzeugung eines Alphakanals aber mit unterschiedlichen Werten). Vielen Dank für Lösungsvorschläge!
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 10.481
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.02.2017, 12:48     Titel: Re: Alpha-Compositing von ImageMagick's CopyOpacity emuliere
  Antworten mit Zitat      
Hallo gubach,

Ich sehe auf den verlinkten Bildern (die übrigens sehr toll aussehen), viel bunte Fraben, erkenne aber nicht, auf welche Details Du hinaus willst. Ich sehe weder die Treppeneffekte, noch wie sie sich mit welcher Methode verändern.

Da ich nicht mit ImageMagick arbeite, weiß ich nicht, welche Funktion dort genau eingesetzt wird. Hast Du die mathematische Definition dazu?

Zitat:
Code:
FG = uint8(CM_mask_blur_alpha .* FG + (1 - CM_mask_blur_alpha) .* BG);

Arbeitest Du hier mit UINT8 Daten? Eine Mutliplikation mit doubles erscheint mir sinnvoller.
Welche Dimensionen hat FG und CM_mask_blur_alpha? Und wieso ändert es etwas, wenn Du mit bsxfun multiplizierst?

Eigentlich sollte das Alpha-Blending mit alpha * Img1 + (1 - alpha) * Img2 problemlos funktionieren. Das Problem könnte nur sein, dass entweder die Typen (int8 und double) vermischt sind, oder die Multiplikation mit der 2D-Alpha Maske und dem 3D-RGB-Bild nicht korrekt durchgeführt wird.

Ein paar einfache Beispiele mit direkt eingefügten kleinen Bildern (nicht verlinkt, denn das ist weniger übersichtlich) könnte hilfreich sein. Vielleicht auch Beispiel-Daten mit ein paar Pixeln.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2017, 14:06     Titel:
  Antworten mit Zitat      
Hallo Jan S,

> ... erkenne aber nicht, auf welche Details Du hinaus willst. Ich sehe weder die Treppeneffekte, noch wie sie sich mit welcher Methode verändern.

Wie (alle?) Viewer verwendet der von Flicker Anti-Aliasing, d.h. man muss den aufwendigeren Weg gehen, die Orginal Datei (3000x3000) laden und mit einem Graphikeditor (z.B. PS, Gimp) vergrößern. Mit Ausschnitten ist das Problem, dass dann doch keiner erkennt, welcher Teil zu der ehemals schwarzen Region gehört, um dort die Effekte an der Kante zu unterscheiden. Ausserdem kann ich nicht ad hoc das gleiche Motiv mit den unterschiedlichen Ansätzen erzeugen, da der Generierungsalgo auf allen Ebenen randomisiert ist; müsste dazu eine Extraversion schreiben.

Es ist durchaus möglich, dass die unerwünschten Eigenschaften bei den beiden vorgestellten Ansätzen durch uint8-double-Vermischung erzeugt werden, und es wäre gut, wenn dem so wäre, denn dann wäre das Problem lechter zu lösen (programmiere erst seit ca. 3 Wochen mit Matlab; vorher PerlMagick). Die Ansätze stammen von Lösungsvorschlägen von http://stackoverflow.com/questions/.....ansform-with-transparency. Habe aber öfters Fehlermeldungen bekommen, die auf Vermischung heraus laufen, wobei die dargestellten Ansätze zumindest formal akzeptiert wurden.

Um diesen Weg zu verfolgen hier Info über die Maskenerzeugung: Die Graustufenmaske wird in Matlab aus einem weißen Bild erzeugt, auf das die gleiche geometrische Transformation mit imtransform angewendet wird, wie bei den Vordergrundbildern; gefolgt von einer morphologischen Operation, bei der die beiden schwarzen Regionen erweitert werden, um die Treppenränder zu entfernen; gefolgt von einem Gausßfilter, um einen kontinuierlichen Übergang zu erreichen.
Code:
whiteImage = 255 * ones(cm_out_h, cm_out_h, 'uint8');
CM_mask = imtransform(whiteImage, ..., 'FillValues', 0 );
CM_mask_blur = imgaussfilt(CM_mask, sigma_1);
%Morphologische Operenation: wird noch mit ImageMagick durchgeführt, da ich noch nicht heraus bekommen habe, wie man in imdilate(IM,...) Disk-Kernel definiert: convert in_file -negate -morphology Thicken Disk:5 -negate out_file
CM_mask_blur_alpha = double(CM_mask)/255;


> Und wieso ändert es etwas, wenn Du mit bsxfun multiplizierst?
die beiden Lösungsvorschläge wurden als gleichwertig betrachtet, doch ich kann in den Bildergebnissen die beschriebenen Unterschiede sehen, wobei die bsxfun Version visuell etwas besser ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
gubach
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2017, 19:32     Titel:
  Antworten mit Zitat      
Hier ein Ausschnitt der ehemals schwarzen Region mit dem Postprocessing in IM mit CopyOpacity als Referenz ohne sichtbare Treppen-Kante
https://www.flickr.com/photos/gbach.....936/in/dateposted-public/
und hier der ungefähr gleiche Ausschnitt mit dem bsxfun-Ansatz mit deutlich sichtbaren Treppenkanten
https://www.flickr.com/photos/gbach.....406/in/dateposted-public/


Zu der Theorie, dass die Probleme verursacht werden, dass unterschiedliche Datentypen uint8 vs double verwendet werden: Wenn Maske, FG und BG double ist, so
erzeugt das oben beschriebene FG = uint8(bsxfun ...) wenigstens ein Composing in den richtigen Farben, während
Code:
FG = double(bsxfun(@times, CM_mask_blur_alpha, FG) + bsxfun(@times, (1 - CM_mask_blur_alpha), BG));

Falschfarben mit überwiegend Weiß erzeugt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.481
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.02.2017, 15:22     Titel:
  Antworten mit Zitat      
Hallo gubach,

Vielleicht ist es trivial, aber ich erwähne es mal: Es kommt nicht nur auf den Typ der Variablen an. Man kann auch doubles von 0 bis 255 verwenden und bei der Multiplikation mit UINT8 treten keine Probleme auf. Bilder im double-Format werden aber auch mit den Werten von 0.0 bis 1.0 interpretiert und wenn man dann Werte von 0 bis 255 nimmt, wird alles oberhalb von 1.0 als gesättig interpretiert, also als 1.0.
Bei Alpha-Blending würde ich deshalb sicherheitshalber alle Inputs per im2double in doubles mit dem Werte-Bereich 0.0 bis 1.0 umwandeln.

Beim Rechnen mit UINT8 treten oft unerwartete die Sättigungs-Effekte ein:
Code:
(uint8(254) + uint8(252)) / 2
% >> 128

Ein seltsamer Mittelwert, oder? Aber uint8(254) + uint8(252) ergibt die größte mögliche UINT8 Zahl, nämlich 255. Und wenn man die durch 2 teilt, erhält man 128. Und solche Effekte könnte bei den Alpha-Blending-Formeln für unerwartete Ergebnisse sorgen.

Gruß, Jan

Vielleicht hilft das weiter.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2017, 16:01     Titel:
  Antworten mit Zitat      
Hallo Jan S,

> im2double
Wie geschrieben sind Maske, FG und BG double und nur FG = uint8(bsxfun ...) erzeugt etwas erwartetes. Wenn ich zusätzlich mit im2double im2double anfange, bekomme ich ein schwarzes Ergebnis.

Ich versuche, die Graustufenmaske zu optimieren, damit ich die Treppenkanten loswerde; bislang aber noch ohne Erfolg. Dies mache ich gerade aus Matlab, indem ich mit einem Systemcall ImageMagick aufrufe:
Code:
system_string = strcat('convert ', output_meta_folder, 'CM_mask.jpg', ' -negate -morphology Thicken Disk:10 -negate -quality 98% ', output_meta_folder, 'CM_mask_morpho.jpg');
disp(system_string);

Angezeigt wird aber:
convertD:\D-ART\Abstrakt_ART\CM\CM_mask.jpg -negate -morphology Thicken Disk:10 -negate -quality 98%D:\D-ART\Abstrakt_ART\CM\CM_mask_morpho.jpg
mit der Fehlermeldung
Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.
Die Blanks vor dem Dateipfad fehlen, obwohl ich sie in 'convert ' und '... -quality 98% ' setze. Dies funktioniert zumindest beim Systemcall in Perl; in Matlab erscheint mir dieses Vehalten nicht konsistent insbesondere da es mit dem Workaround output_meta_folder_string2 = [' ', output_meta_folder]; dann wieder funktioniert.
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2017 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.