Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Farbinterpolation von Zwischenpixel (https://www.delphipraxis.net/155482-farbinterpolation-von-zwischenpixel.html)

shmia 25. Okt 2010 17:55


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.

Neutral General 25. Okt 2010 17:56

AW: Farbeinterpolation von Zwischenpixel
 
Du bildest den Durchschnitt der RGB-Werte der umliegenden Pixel?

himitsu 25. Okt 2010 18:04

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

shmia 25. Okt 2010 18:08

AW: Farbeinterpolation von Zwischenpixel
 
Zitat:

Zitat von Neutral General (Beitrag 1057763)
Durchschnitt der RGB-Werte der umliegenden Pixel

Ja, schon, nur muss die Entfernung zu jedem der umliegenden Pixel berücksichtigt werden.
Wäre der Punkt genau in der Mitte zwischen 4 Pixeln, dann wäre die Farbe:
Delphi-Quellcode:
// 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];
Liegt mein Punkt nicht genau in der Mitte wie im Anfangsbeispiel, tja dann...

@himitsu: deine Formel scheint noch nicht ganz korrekt zu sein, aber sie bringt mich auf diese:
Delphi-Quellcode:
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)
So sieht es schön symmetrisch aus. :P

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));

rollstuhlfahrer 25. Okt 2010 18:58

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 (SetStretchBltMode und HALFTONE).

Bernhard

Hawkeye219 25. Okt 2010 19:09

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 Interpolationsroutine ist dir ja bekannt.

Gruß Hawkeye

Sir Rufo 25. Okt 2010 19:43

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:
4*A+2*B+2*C+1*D
--------------- = 44.4%*A + 22.2%*B + 22.2%*C + 11.2%*D
       9
Möglich wäre auch eine Betrachtung als genäherter Kreis, wo die Nachbarfelder auf den Diagonalen nur zur Hälfte eingerechnet werden
Code:
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
Man könnte jetzt auch noch den Mittelpunkt doppelt reinzählen
Code:
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
Die Formel ist jetzt nur noch ein wenig Gehirnschmalz und Fleißarbeit :mrgreen:

jfheins 25. Okt 2010 19:49

AW: Farbinterpolation von Zwischenpixel
 
Oder gleich Bikubische Interpolation :)

=> http://de.wikipedia.org/wiki/Interpolation_(Fotografie)

shmia 26. Okt 2010 13:47

AW: Farbinterpolation von Zwischenpixel
 
Liste der Anhänge anzeigen (Anzahl: 3)
@jfheins:
Danke, jetzt weiss ich wie das heisst, was ich da tue:
Bilineare Interpolation

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 15:48 Uhr.

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