![]() |
Farbinterpolation von Zwischenpixel
Ich habe einen Canvas mit 24 Bit Farbtiefe.
Wir könnte man die Farbe an der Koordinate (x=50.25, y=22.75) ausrechnen, wenn die Farben der 4 umgebenden Pixel (50,22)|(51,22)|(50,23)|(51,23) bekannt sind. |
AW: Farbeinterpolation von Zwischenpixel
Du bildest den Durchschnitt der RGB-Werte der umliegenden Pixel?
|
AW: Farbeinterpolation von Zwischenpixel
Natürlich Prozentual
x=50.25 y=22.75 FarbwertVon[50,22] * 0.25 * (1 - 0.75) + FarbwertVon[51,22] * (1 - 0.25) * 0.75 + FarbwertVon[50,23] * 0.25 * (1 - 0.75) + FarbwertVon[51,23] * (1 - 0.25) * 0.75 FarbwertVon[Trunc(x), Trunc(y)] * Frac(x) * (1 - Frac(y)) + FarbwertVon[Trunc(x) + 1, Trunc(y)] * (1 - Frac(x)) * Frac(y) + FarbwertVon[Trunc(x), Trunc(y) + 1] * Frac(x) * (1 - Frac(y)) + FarbwertVon[Trunc(x) + Trunc(y) + 1] * (1 - Frac(x)) * Frac(y) also jeweils für Rot, Grün und Blau |
AW: Farbeinterpolation von Zwischenpixel
Zitat:
Wäre der Punkt genau in der Mitte zwischen 4 Pixeln, dann wäre die Farbe:
Delphi-Quellcode:
Liegt mein Punkt nicht genau in der Mitte wie im Anfangsbeispiel, tja dann...
// x,y :Integer
color := 0.25 * Pixel[x,y] + 0.25 * Pixel[x+1,y] + 0.25 * Pixel[x,y+1] + 0.25 * Pixel[x+1,y+1]; @himitsu: deine Formel scheint noch nicht ganz korrekt zu sein, aber sie bringt mich auf diese:
Delphi-Quellcode:
So sieht es schön symmetrisch aus. :P
Pixel[Trunc(x), Trunc(y)] * (1 - Frac(x)) * (1 - Frac(y))
+ Pixel[Trunc(x) + 1, Trunc(y)] * (1 - Frac(x)) * Frac(y) + Pixel[Trunc(x), Trunc(y) + 1] * Frac(x) * (1 - Frac(y)) + Pixel[Trunc(x) + 1, Trunc(y) + 1] * Frac(x) * Frac(y) PS: nochmal überlegt, so müsste es sein:
Delphi-Quellcode:
color := Round(
Pixel[Trunc(x), Trunc(y)] * (1 - Frac(x)) * (1 - Frac(y)) + Pixel[Trunc(x) + 1, Trunc(y)] * Frac(x) * (1 - Frac(y)) + Pixel[Trunc(x), Trunc(y) + 1] * (1 - Frac(x)) * Frac(y) + Pixel[Trunc(x) + 1, Trunc(y) + 1] * Frac(x) * Frac(y)); |
AW: Farbinterpolation von Zwischenpixel
Du willst nicht zufällig ein Bild skalieren? - Dafür gibt es schon genug andere Methoden. Die erste bringt Jedi mit (Graphics.pas) und die zweite Windows selbst (
![]() Bernhard |
AW: Farbinterpolation von Zwischenpixel
Hallo Andreas,
du könntest es mit einer dreimaligen Interpolation versuchen: 1. Interpolation: Farbe(50,22) und Farbe(51,22) mit blend=0.25 ergibt Farbe C1 2. Interpolation: Farbe(50,23) und Farbe(51,23) mit blend=0.25 ergibt Farbe C2 3. Interpolation: C1 und C2 mit blend=0.75 ergibt die gesuchte Farbe Die dazu notwendige ![]() Gruß Hawkeye |
AW: Farbinterpolation von Zwischenpixel
Liste der Anhänge anzeigen (Anzahl: 1)
Ein Pixel (1x1) soll in (4x4) 16 Pixel aufgeteilt werden
Am besten ist es sich das mal aufzumalen, dann wird es leichter ;) (siehe Anhang) Wenn wir jetzt den Farbwert für das kleine Kästchen berechnen wollen, dann müssen wir uns in der Nachbarschaft umsehen. Als Raster nehmen wir aber schon die neue Auflösung. Als Farbwert ergibt sich somit
Code:
Möglich wäre auch eine Betrachtung als genäherter Kreis, wo die Nachbarfelder auf den Diagonalen nur zur Hälfte eingerechnet werden
4*A+2*B+2*C+1*D
--------------- = 44.4%*A + 22.2%*B + 22.2%*C + 11.2%*D 9
Code:
Man könnte jetzt auch noch den Mittelpunkt doppelt reinzählen
3.5*A+1.5*B+1.5*C+0.5*D
----------------------- => 50.0% * A + 21.4%*B + 21.4%*C + 7.2%*D 7
Code:
Die Formel ist jetzt nur noch ein wenig Gehirnschmalz und Fleißarbeit :mrgreen:
4.5*A+1.5*B+1.5*C+0.5*D
--------------------- => 56.25%*A + 18.75%*B + 18.75%*C + 6.25%*D 8 |
AW: Farbinterpolation von Zwischenpixel
|
AW: Farbinterpolation von Zwischenpixel
Liste der Anhänge anzeigen (Anzahl: 3)
@jfheins:
Danke, jetzt weiss ich wie das heisst, was ich da tue: ![]() Damit kann ich jetzt Pixel mit Fliesskommakoordinaten auslesen. Es ist z.B. möglich, die Koordinaten mit einer Sinus-Schwingung zu überlagern und so ein Bild zu verzerren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 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-2025 by Thomas Breitkreuz