Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Theorie: Transparenz errechnen (https://www.delphipraxis.net/112557-theorie-transparenz-errechnen.html)

Prototypjack 23. Apr 2008 14:06


Theorie: Transparenz errechnen
 
Moin,

Ich hatte letztens eine Diskussion über Grafik, mit dem Thema Transparenz im speziellen.
Es ging darum, ob man aus einem bzw. mehrerer Bilder die Transparenz rück-errechnen kann. Ich bin überzeugt davon, dass das möglich ist und will mir einen Beweis basteln. Jedoch habe ich nur eine vage Vorstellung von dem, was ich tun will:

Die Theorie:
Ich habe ein halbtransparentes Logo auf einer Fläche in einer Bitmap. Dieses Logo habe ich in 2 (oder auch 3, falls man es in grau auch braucht) Ausführungen, jeweils mit schwarzem und weißem Hintergrund.
Mit dieser Vorgabe müsste ich doch theoretisch die Transparenz der einzelnen Bildpunkte errechnen können, um sie dann in einem Format, welches Transparenz unterstützt, auszugeben (wahlweise PNG).

Bitte sagt mir, falls ich hier komplett auf den Holzweg bin. Ansonsten: Wie geht man an so ein Problem heran? Ich stehe irgendwie auf dem Schlauch was das "zu Papier bringen" des Codes angeht.

Danke & Grüße,
Max

Namenloser 23. Apr 2008 14:13

Re: Theorie: Transparenz errechnen
 
Interessante Sache, diese Idee habe ich auch schons eit längerem. Es gibt ein Gimp-Plugin, das das kann, da müsste sich der Source ja eigentlich finden lassen. Allerdings ist mir leider der Name entfallen. Ich bin auch wirklich kein passionierter Gimp-Nutzer.

Medium 23. Apr 2008 18:03

Re: Theorie: Transparenz errechnen
 
Das funktioniert mit deinem Ausgangsmaterial höchstens näherungsweise, und auch nur mit größerem Aufwand. Schau, du errechnest Transparenz folgendermaßen:

c* = a*c1 + (1-a)*c2

a = Alpha
c1 = Farbe des Logos an einem Pixel
c2 = Farbe des Hintergrunde an einem Pixel
c* = Neue Farbe

Du bildest also aus 3 definierten Informationen eine 4. Nun möchtest du diese Formel aber quasi nach a umstellen, kennst aber selber nur c1 und c*, wodurch c2 als zweite Unbekannte zusätzlich zum a verbleibt. Du willst quasi aus 2 Informationen 2 weitere Berechnen, wobei zu deren Entstehung aus 3 eine Information erstellt wurde.
Auch die Tatsache, dass es um 3 Farbanteile (RGB) geht hilft dir nicht weiter. Man kommt mit vieeel Umformerei zwar so weit, dass man 2 der c2-Anteile durch die jeweils dritte ausdrücken kann, aber da diese weiterhin unbekannt bleibt ist das maximal ein Weg, mit dem du bestimmen kannst, in welchem Intervall die Anteile von c2 vorkommen können, da du die Grenzen (0..255) kennst.
Und das ist auch so weit wie man kommt, wenn der Hintergrund beliebig ist. Wenn der Hintergrund garantiert einfarbig, am besten noch grau ist, wird es möglich, da man aus einer nicht bedeckten Stelle den gesamten Hintergrund bestimmen kann.

Evtl. zur Verdeutlichung: Du kannst einen 50% roten Pixel im Zielbild (c*) auf unterschiedliche Weise erhalten. Angenommen dein Logo ist an der Stelle komplett Schwarz:
1) Hintergrund ist 100% Rot und Alpha 0,5
2) Hintergrund ist 50% Rot und Alpha 0,0
3) Alles dazwischen
Du weisst also nur, dass sich Alpha irgendwo zwischen 0 und 0,5 befinden muss, und das Hintergrundbild an diesem Pixel Mittel- bis Vollrot ist, und dass diese antiproportional zueinander sind. Ohne nun den Originalhintergrund exakt zu kennen, kannst du Alpha niemals genau bestimmen. Was allerdings geht ist, dass man die selbe Intervallbildung für Grün und Blau auch noch macht, und der Schnitt der 3 Intervalle eine engere Näherung ergibt, welche dann auch die best mögliche ist. (Das geht aber auch nur, wenn die Transparenz einfarbig ist (Alpha fur r, g und b das selbe). Sobald man auch noch farbige Transparenzen zulässt, ist selbst diese Eingrenzug dahin.)

Ein Extremfall: Dein Logo ist an einer stelle 100% Blau, das Zielbild (c*) auch. Jetzt kann Alpha 0-1 sein, und der Hintergrund 0%-100% Blau (zwar antiproportional, aber das hilft uns allein leider nicht aufs Pferd).


Wenn man den Mensch noch als verarbeitendes Element dazu nimmt, kann man noch ein wenig weiter spinnen:
Aus den berechneten Intervallen nimmst du für die Werte des Originalhintergrundes und für die Alphas je X Prozent, und machst für diese 2 Werte je einen Slider, und zeigst das Bild mit den sich ergebenen Werten für den Originalhintergrund an. Der Mensch kann nun die 2 Slider so einstellen, dass nach seinem Ermessen, der Originalhintergrund am besten wiederhergestellt ist. Wie gut das geht hängt ganz vom Hintergrund ab, und eine exakte Lösung gibt das auch nicht her, aber zumindest weisst du dann noch genauer, wie viel Prozent du von den ermittelten Intervallen nehmen musst um von einer mathematisch best möglichen, zu einer subjektiv optimierten Lösung zu kommen.

Dass du das Logo mit wahlweise schwarzem und weissem Rand vorliegen hast, hilft maximal so viel weiter, als dass du aus der Differenz der beiden zumindest schon mal die Stellen mit Alpha=0 ermitteln kannst. Mehr allerdings nicht.


Fazit: Mit viel Aufand kommt man zu einer guten Näherung, aber exakt und dann auch sehr einfach geht es nur, wenn du auch den Hintergrund im Original vorliegen hast.

Edit: Achso! Damit ist allerdings auch noch eine Sache gänzlich ungeklärt: Wo auf dem Bild liegt das Logo eigentlich? Die Positionierung müsste also zuvor auch noch ein Mensch machen, und zwar pixelgenau!

BUG 23. Apr 2008 18:52

Re: Theorie: Transparenz errechnen
 
Zitat:

Zitat von Medium
sehr einfach geht es nur, wenn du auch den Hintergrund im Original vorliegen hast.

Also, ich hab das so verstanden, das der Hintergrund des Logo entweder komplett schwarz oder komplett weiß ist.
Wenn beide Versionen vorliegen kann man sogar die von dir genannten Unsicherheiten (0-100% Durchsichtig) bei schwarz und weiß ausschalten.

MfG,
LivingUndead

Medium 23. Apr 2008 19:16

Re: Theorie: Transparenz errechnen
 
Wenn das wirklich so gemeint war, dass das Logo halbtransparent auf einem homogenen weissen und schwarzen Hintergrund vorliegt, dann wirds ja fast schon langweilig. Da dann jeder Pixel um den gleichen Betrag aufegellt bzw. abgedunkelt wurde, führt das jeweilige arithmetische Mittel zum nicht-transparenten Logo, und dann kann man einfach per Subtraktion von einem der Bilder die Maske herausfinden. Als einzige Unsicherheit bleiben hier die Grenzen 0..255. Eine weisse Fläche im Logo wird auf dem weissen Bild nicht weisser, auf dem schwarzen aber dunkler. Somit ergibt sich durch dieses Clipping ein zu kleiner Alphawert. Bzw. ist das schlimme daran, dass ein bereits sehr helles Weiss ganz weiss würde, und somit nicht mehr von ähnlichen Helligkeiten unterscheidbar wird, da alle bei 255 abgeschnitten werden. Analog dazu Schwarz im dunklen Bild.
Voraussetzung ist zudem noch, dass bei beiden Varianten die selbe Alphamaske benutzt wurde, sonst erhält man einen 50% Mix der 2 Ursprungsmasken.

Prototypjack 27. Apr 2008 11:57

Re: Theorie: Transparenz errechnen
 
Zitat:

Zitat von Medium
Wenn das wirklich so gemeint war, dass das Logo halbtransparent auf einem homogenen weissen und schwarzen Hintergrund vorliegt, dann wirds ja fast schon langweilig.

Ja, genau so war das gemeint. Doch ich komme trotzdem nicht dahinter wie ich das (in der Theorie) anstelle, irgendwie stehe ich da auf dem Schlauch.

Grüße,
Max

SirThornberry 27. Apr 2008 12:28

Re: Theorie: Transparenz errechnen
 
ist doch eigentlich ganz einfach. Schwarz ist der Wert 0, Weiß ist pro Farbwert (rgb) der Wert 255.

wenn du jetzt auf dem schwarzen Hintergrund ein Pixel mit einem Farbwert von 25 hast und die Transparenzt ist 50/50 (also 50%) dann ist das original 50.

Denn; (50 + 0) / 2 = 25
Demzufolge: 25 * 2 = 50


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz