Vergrößerungsfilter hq2x

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: Vergrößerungsfilter hq2x

BeitragFr, Nov 27, 2009 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Am hq3x Filter arbeite ich noch, der will nicht so wie ich will Wink

Mit diesem Filter vergößert ihr Bilder mit dem HQ2X filter(http://en.wikipedia.org/wiki/Hqx)
BlitzBasic: [AUSKLAPPEN]
Dim Pixel3x3(3,3)
Dim PixelO2x2(2,2)
Function HQ2X(IMG)
Local IMG2, X, Y, X2, Y2
Local A,B,C
Local D,E,F
Local G,H,I
Local IMGw = ImageWidth(IMG), IMGh = ImageHeight(IMG)

Dim Pixel3x3(3,3)
Dim PixelO2x2(2,2)

IMG2 = CreateImage(ImageWidth(IMG)*2,ImageHeight(IMG)*2)
LockBuffer ImageBuffer(IMG):LockBuffer ImageBuffer(IMG2)

For X = 0 To ImageWidth(IMG)-1
For Y = 0 To ImageHeight(IMG)-1
For X2 = -1 To 1
For Y2 = -1 To 1
Pixel3x3((X2+1),(1+Y2)) = ReadPixelFast(X,Y, ImageBuffer(IMG))
If X2+X >= 0 And X2+X < IMGw And Y2+Y >= 0 And Y2+Y < IMGh
Pixel3x3((1+X2),(1+Y2)) = ReadPixelFast(X+X2,Y+Y2, ImageBuffer(IMG))
EndIf
Next
Next
A = Pixel3x3(0,0):B = Pixel3x3(1,0):C = Pixel3x3(2,0)
D = Pixel3x3(0,1):E = Pixel3x3(1,1):F = Pixel3x3(2,1)
G = Pixel3x3(0,2):H = Pixel3x3(1,2):I = Pixel3x3(2,2)

PixelO2x2(0,0) = E:PixelO2x2(1,0) = E
PixelO2x2(0,1) = E:PixelO2x2(1,1) = E
If B <> H And D <> F
If D = B Then PixelO2x2(0,0) = D
If B = F Then PixelO2x2(1,0) = F
If D = H Then PixelO2x2(0,1) = D
If H = F Then PixelO2x2(1,1) = F
EndIf

WritePixelFast X*2+0, Y*2+0, PixelO2x2(0,0), ImageBuffer(IMG2)
WritePixelFast X*2+1, Y*2+0, PixelO2x2(1,0), ImageBuffer(IMG2)
WritePixelFast X*2+0, Y*2+1, PixelO2x2(0,1), ImageBuffer(IMG2)
WritePixelFast X*2+1, Y*2+1, PixelO2x2(1,1), ImageBuffer(IMG2)
Next
Next

UnlockBuffer ImageBuffer(IMG):UnlockBuffer ImageBuffer(IMG2)
Return IMG2
End Function


MfG
CGamer
Warbseite
  • Zuletzt bearbeitet von Xaymar am Fr, Nov 27, 2009 18:37, insgesamt einmal bearbeitet
 

Krischan

BeitragFr, Nov 27, 2009 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Funzt, aber das

Dim Pixel3x3(3,3)
Dim PixelO2x2(2,2)

sollte aber ausserhalb der Function liegen sonst gibt es eine FM.

HQ4X kannste Dir ja sparen, das ist nur 2x HQ2X aufgerufen, also

scaled=HQ2X(HQ2X(image))

Xaymar

ehemals "Cgamer"

BeitragFr, Nov 27, 2009 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
es muss drinnen und draußen liegen. habe es glaube ich ausversehen nicht mitkopiert, kann ja mal vorkommen.
Was mich derzeit stört ist, das die Forumlierung der Regeln für HQ3X falsch ist auf dieser Seite. laut der Blitzumsetzung der Regel wird nämlich nur Nearest Vergrößerung gemacht, nicht aber das eigentliche Sad Kann aber auch am Code liegen, was ich weniger glaube
http://scale2x.sourceforge.net/algorithm.html

Edit: der aktuelle HQ3X code:
BlitzBasic: [AUSKLAPPEN]
Dim Pixel3x3(3,3)
Dim PixelO3x3(3,3)
Function HQ3X(IMG)
Local IMG2, X, Y, X2, Y2
Local A,B,C,E0,E1,E2
Local D,E,F,E3,E4,E5
Local G,H,I,E6,E7,E8

Dim Pixel3x3(3,3)
Dim PixelO3x3(3,3)

IMG2 = CreateImage(ImageWidth(IMG)*3,ImageHeight(IMG)*3)
LockBuffer ImageBuffer(IMG):LockBuffer ImageBuffer(IMG2)

For X = 0 To ImageWidth(IMG)-1
For Y = 0 To ImageHeight(IMG)-1
For X2 = -1 To 1
For Y2 = -1 To 1
Pixel3x3((1+X2),(1+Y2)) = ReadPixelFast(X,Y, ImageBuffer(IMG))
If X2+X >= 0 And X2+X < IMGw And Y2+Y >= 0 And Y2+Y < IMGh
Pixel3x3((1+X2),(1+Y2)) = ReadPixelFast(X+X2,Y+Y2, ImageBuffer(IMG))
EndIf
Next
Next
A = Pixel3x3(0,0):B = Pixel3x3(1,0):C = Pixel3x3(2,0)
D = Pixel3x3(0,1):E = Pixel3x3(1,1):F = Pixel3x3(2,1)
G = Pixel3x3(0,2):H = Pixel3x3(1,2):I = Pixel3x3(2,2)

PixelO3x3(0,0) = A:PixelO3x3(1,0) = B:PixelO3x3(2,0) = C
PixelO3x3(0,1) = D:PixelO3x3(1,1) = E:PixelO3x3(2,1) = F
PixelO3x3(0,2) = G:PixelO3x3(1,2) = H:PixelO3x3(2,2) = I

If D=B And B<>F And D<>H Then PixelO3x3(0,0) = D
If (D=B And B<>F And D<>H And E<>C) Or (B=F And B<>D And F<>H And E<>A) Then PixelO3x3(1,0) = B
If B=F And B<>D And F<>H Then PixelO3x3(2,0) = F
If (D=B And B<>F And D<>H And E<>G) Or (D=H And D<>B And H<>F And E<>A) Then PixelO3x3(0,1) = D

If (B=F And B<>D And F<>H And E<>I) Or (H=F And D<>H And B<>F And E<>C) Then PixelO3x3(2,1) = F
If D=H And D<>B And H<>F Then PixelO3x3(0,2) = D
If (D=H And D<>B And H<>F And E<>I) Or (H=F And D<>H And B<>F And E<>G) Then PixelO3x3(1,2) = F
If H=F And D<>H And B<>F Then PixelO3x3(2,2) = F

WritePixelFast X*3+0, Y*3+0, PixelO3x3(0,0), ImageBuffer(IMG2):WritePixelFast X*3+1, Y*3+0, PixelO3x3(1,0), ImageBuffer(IMG2):WritePixelFast X*3+2, Y*3+0, PixelO3x3(2,0), ImageBuffer(IMG2)
WritePixelFast X*3+0, Y*3+1, PixelO3x3(0,1), ImageBuffer(IMG2):WritePixelFast X*3+1, Y*3+1, PixelO3x3(1,1), ImageBuffer(IMG2):WritePixelFast X*3+2, Y*3+1, PixelO3x3(2,1), ImageBuffer(IMG2)
WritePixelFast X*3+0, Y*3+2, PixelO3x3(0,2), ImageBuffer(IMG2):WritePixelFast X*3+1, Y*3+2, PixelO3x3(1,2), ImageBuffer(IMG2):WritePixelFast X*3+2, Y*3+2, PixelO3x3(2,2), ImageBuffer(IMG2)
Next
Next

UnlockBuffer ImageBuffer(IMG):UnlockBuffer ImageBuffer(IMG2)
Return IMG2
End Function
Warbseite
 

Krischan

BeitragFr, Nov 27, 2009 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich mir den C++ Source vom HQ3X Filter aus http://web.archive.org/web/200.../hq3x.html so anschaue sieht das so aus, als ob die Pixel noch interpoliert werden müssten. Auch dieser Screenshot zeigt Interpolation:

user posted image

EDIT: siehe auch Zitat dort:

Zitat:
For the next step, which is filtering, a lookup table with 256 entries is used, one entry per each combination of close/distant colored neighbors. Each entry describes how to mix the colors of the source pixels from 3x3 area to get interpolated pixels of the filtered image.

Xaymar

ehemals "Cgamer"

BeitragFr, Nov 27, 2009 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich komm nicht an den C++ Source. Kannst du den mal hochladen?
Warbseite
 

Krischan

BeitragFr, Nov 27, 2009 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Da, der ist aber mit Assembler verseucht:

http://www.christianhart.de/temp/hq3x_src.zip

Xaymar

ehemals "Cgamer"

BeitragFr, Jan 08, 2010 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mich mal drangesetzt und vorerst erstmal ein FakeHQ3X erstellt.
BlitzBasic: [AUSKLAPPEN]
Function FakeHQ3X(IMG)
Dim Pixel3x3(3,3)
Dim PixelO3x3(3,3)

IMG3 = HQ2X(IMG)
Local tw = ImageWidth(IMG3), th = ImageHeight(IMG3)
Local IMGw = tw, IMGh = th

IMG2 = CreateImage(tw*3,th*3)
LockBuffer ImageBuffer(IMG3):LockBuffer ImageBuffer(IMG2)

For X = 0 To tw-1
For Y = 0 To th-1
For X2 = -1 To 1:For Y2 = -1 To 1
Pixel3x3((1+X2),(1+Y2)) = ReadPixelFast(X,Y, ImageBuffer(IMG3))
If X2+X >= 0 And X2+X < IMGw And Y2+Y >= 0 And Y2+Y < IMGh
Pixel3x3((1+X2),(1+Y2)) = ReadPixelFast(X+X2,Y+Y2, ImageBuffer(IMG3))
EndIf
PixelO3x3(1+X2,1+Y2) = 0
Next:Next

PixelO3x3(0,0) = I2RGB(I3RGB(Pixel3x3(1,0),Pixel3x3(0,1),Pixel3x3(1,1)),Pixel3x3(0,0))
PixelO3x3(1,0) = I2RGB(I5RGB(Pixel3x3(0,0),Pixel3x3(2,0),Pixel3x3(0,1),Pixel3x3(1,1),Pixel3x3(1,1)),Pixel3x3(1,0))
PixelO3x3(2,0) = I2RGB(I3RGB(Pixel3x3(1,0),Pixel3x3(2,1),Pixel3x3(1,1)),Pixel3x3(2,0))
PixelO3x3(0,1) = I2RGB(I5RGB(Pixel3x3(0,0),Pixel3x3(0,1),Pixel3x3(2,0),Pixel3x3(1,0),Pixel3x3(1,2)),Pixel3x3(0,1))
PixelO3x3(1,1) = I2RGB(I8RGB(Pixel3x3(0,0),Pixel3x3(1,0),Pixel3x3(2,0),Pixel3x3(0,1),Pixel3x3(2,1),Pixel3x3(0,2),Pixel3x3(1,2),Pixel3x3(2,2)),Pixel3x3(1,1))
PixelO3x3(2,1) = I2RGB(I5RGB(Pixel3x3(1,0),Pixel3x3(2,0),Pixel3x3(1,1),Pixel3x3(1,2),Pixel3x3(2,2)),Pixel3x3(2,1))
PixelO3x3(0,2) = I2RGB(I3RGB(Pixel3x3(0,1),Pixel3x3(1,1),Pixel3x3(1,2)),Pixel3x3(0,2))
PixelO3x3(1,2) = I2RGB(I5RGB(Pixel3x3(0,2),Pixel3x3(2,2),Pixel3x3(0,1),Pixel3x3(1,1),Pixel3x3(1,1)),Pixel3x3(1,2))
PixelO3x3(2,2) = I2RGB(I3RGB(Pixel3x3(2,2),Pixel3x3(1,1),Pixel3x3(2,1)),Pixel3x3(2,2))

For X2 = 0 To 2:For Y2 = 0 To 2
WritePixelFast X*3+X2, Y*3+Y2, PixelO3x3(X2,Y2), ImageBuffer(IMG2)
Next:Next
Next
Next

UnlockBuffer ImageBuffer(IMG3):UnlockBuffer ImageBuffer(IMG2)

TFormFilter 1:FreeImage IMG3:ScaleImage IMG2,0.25,0.25

IMG3 = HQ2X(IMG2):FreeImage IMG2

Return IMG3
End Function

Function HQ3X(IMG)
Return FakeHQ3X(IMG)
End Function

Function I2RGB(RGB1,RGB2)
Local R1 = RGB1 Shl 8 Shr 24, G1 = RGB1 Shl 16 Shr 24, B1 = RGB2 Shl 24 Shr 24
Local R2 = RGB2 Shl 8 Shr 24, G2 = RGB2 Shl 16 Shr 24, B2 = RGB2 Shl 24 Shr 24

R = (R1+R2)/2.0:G = (G1+G2)/2.0:B = (B1+B2)/2.0

RGB = R Shl 16 + G Shl 8 + B
Return RGB
End Function
Function I3RGB(RGB1,RGB2,RGB3)
Local R1 = RGB1 Shl 8 Shr 24, G1 = RGB1 Shl 16 Shr 24, B1 = RGB2 Shl 24 Shr 24
Local R2 = RGB2 Shl 8 Shr 24, G2 = RGB2 Shl 16 Shr 24, B2 = RGB2 Shl 24 Shr 24
Local R3 = RGB3 Shl 8 Shr 24, G3 = RGB3 Shl 16 Shr 24, B3 = RGB3 Shl 24 Shr 24

R = (R1+R2+R3)/3.0:G = (G1+G2+G3)/3.0:B = (B1+B2+B3)/3.0

RGB = R Shl 16 + G Shl 8 + B
Return RGB
End Function
Function I5RGB(RGB1,RGB2,RGB3,RGB4,RGB5)
Local R1 = RGB1 Shl 8 Shr 24, G1 = RGB1 Shl 16 Shr 24, B1 = RGB2 Shl 24 Shr 24
Local R2 = RGB2 Shl 8 Shr 24, G2 = RGB2 Shl 16 Shr 24, B2 = RGB2 Shl 24 Shr 24
Local R3 = RGB3 Shl 8 Shr 24, G3 = RGB3 Shl 16 Shr 24, B3 = RGB3 Shl 24 Shr 24
Local R4 = RGB4 Shl 8 Shr 24, G4 = RGB4 Shl 16 Shr 24, B4 = RGB4 Shl 24 Shr 24
Local R5 = RGB5 Shl 8 Shr 24, G5 = RGB5 Shl 16 Shr 24, B5 = RGB5 Shl 24 Shr 24

R = (R1+R2+R3+R4+R5)/5.0:G = (G1+G2+G3+G4+G5)/5.0:B = (B1+B2+B3+B4+B5)/5.0

RGB = R Shl 16 + G Shl 8 + B
Return RGB
End Function
Function I8RGB(RGB1,RGB2,RGB3,RGB4,RGB5,RGB6,RGB7,RGB8)
Local R1 = RGB1 Shl 8 Shr 24, G1 = RGB1 Shl 16 Shr 24, B1 = RGB2 Shl 24 Shr 24
Local R2 = RGB2 Shl 8 Shr 24, G2 = RGB2 Shl 16 Shr 24, B2 = RGB2 Shl 24 Shr 24
Local R3 = RGB3 Shl 8 Shr 24, G3 = RGB3 Shl 16 Shr 24, B3 = RGB3 Shl 24 Shr 24
Local R4 = RGB4 Shl 8 Shr 24, G4 = RGB4 Shl 16 Shr 24, B4 = RGB4 Shl 24 Shr 24
Local R5 = RGB5 Shl 8 Shr 24, G5 = RGB5 Shl 16 Shr 24, B5 = RGB5 Shl 24 Shr 24
Local R6 = RGB6 Shl 8 Shr 24, G6 = RGB6 Shl 16 Shr 24, B6 = RGB6 Shl 24 Shr 24
Local R7 = RGB7 Shl 8 Shr 24, G7 = RGB7 Shl 16 Shr 24, B7 = RGB7 Shl 24 Shr 24
Local R8 = RGB8 Shl 8 Shr 24, G8 = RGB8 Shl 16 Shr 24, B8 = RGB8 Shl 24 Shr 24

R = (R1+R2+R3+R4+R5+R6+R7+R8)/8.0:G = (G1+G2+G3+G4+G5+G6+G7+G8)/8.0:B = (B1+B2+B3+B4+B5+B6+B7+B8)/8.0

RGB = R Shl 16 + G Shl 8 + B
Return RGB
End Function


Bringt aber noch nicht die erwarteten ergebnisse. Wenn ich lust habe, code ich den original HQ3X filter nach, derzeit aber keine lust.

Edit: verbessert, sollte nun um einiges besser aussehen, dafür allerdings auch mehr performance brauchen:/

Edit2: Nochmals verbessert sieht nun deutlich besser aus
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group