2 Bilder miteinander verrechnen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

2 Bilder miteinander verrechnen

Beitrag von MenschMarkus »

Hi,
bin gerade dabei zwei Bilder miteinander zu verrechnen, hier gegeneinander aufzudividieren. Dazu gehe ich wie folgt vor:

1. Ich erzeuge 3 Vektoren mit der Anzahl der Bildpixel

Code: Alles auswählen

Dim AddImage1.s(Width*Height)
Dim AddImage2.s(Width*Height)
Dim ResultImage.s(Width*Height)
2. Ich lese Bild 1 in den Speicher

Code: Alles auswählen

CatchImage(#Image_2,dest,len)
3. Ich lese die RGB Werte der einzelnen Pixel aus und schreibe Sie in Vektor 1

Code: Alles auswählen

StartDrawing(ImageOutput(#Image_2))
    i=1
    For h = 1 To Height-1
        For w = 1 To Width-1
            strTMP.s = Str(Red(Point(w,h))) + ";"
            strTMP.s + Str(Green(Point(w,h))) + ";"
            strTMP.s + Str(Blue(Point(w,h)))
            AddImage1(i) = strTMP.s
             i+1
        Next
    Next
StopDrawing()
4. Vorgang 2+3 Wiederhole ich für das 2. Bild
(Anmerkung: Speichere ich die Bilder in eine Datei und schaue Sie mir an, sind diese OK)

5. Ich Berechne die Bilder und speichere die Daten in den 3. Vektor

Code: Alles auswählen

Procedure.s Division(r1val.i,g1val.i,b1val.i,r2val.i,g2val.i,b2val.i)
    ; E = (256 x I) / (M + 1)   (Bilder dividieren) Quelle: http://docs.gimp.org/de/gimp-concepts-layer-modes.html
    ProcedureReturn Str((r1val * 256)/(r2val + 1)) + ";" + Str((g1val * 256)/(g2val + 1)) + ";" + Str((b1val * 256)/(b2val + 1))
EndProcedure

For i = 1 To (Width*Height)-1
    ResultImage(i) = Division(Val(Left(AddImage2(i),3)),Val(Mid(AddImage2(i),5,3)),Val(Right(AddImage2(i),3)),Val(Left(AddImage1(i),3)),Val(Mid(AddImage1(i),5,3)),Val(Right(AddImage1(i),3)))
Next
6. Das Ergebnis ist ein Fehlfarbenbild, was aber so nicht sein sollte.

Hat jemand eine Idee wo mein Denkfehler liegt?

Nachtrag: So schreibe ich das neue Bild !!

Code: Alles auswählen

StartDrawing(ImageOutput(#Image_Add))
    i=1
    For h = 1 To Height-1
        For w = 1 To Width-1
            Plot(w,h,RGB(Val(Left(ResultImage(i),3)),Val(Mid(ResultImage(i),5,3)),Val(Right(ResultImage(i),3))))
            i+1
        Next
    Next
StopDrawing()    
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2 Bilder miteinander verrechnen

Beitrag von STARGÅTE »

Kannst du mal einen Grund nennen wieso du mit Strings arbeitest?
Wenn du Farben addieren willst, wieso speicherst du es nicht einfach in Integers oder Bytes?

Das ganze Str() und Val() hin und her ist totaler murks.

Die Farben kannst du in einem Long-Array speichern und dann einfach die Kanäle zB so alslesen:

Code: Alles auswählen

Structure Color
	StructureUnion
		Value.l
		Channel.a[4]
	EndStructureUnion
EndStructure

Define Color.Color
Color\Value = RGB(255, 128, 64)

Debug Color\Channel[1]
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: 2 Bilder miteinander verrechnen

Beitrag von MenschMarkus »

Hi Stargate,

Danke für den Hinweis mit dem Long Array. Werde das mal umsetzen, schließlich kann man so Speicherplatz sparen und schneller arbeiten.

Kommen wir aber mal zurück auf meinen "Murks" :)
Wie auch immer das programmiert wird, das Ergebnis sollte aber stimmen. Ich erhalte jedoch ein Fehlfarbenbild als Ergebnis. Das ist es was ich nicht verstehe.
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2 Bilder miteinander verrechnen

Beitrag von STARGÅTE »

Dein Code kann alleine dadurch nicht funktionieren, weil du einerseits deinen Farbkanal mit:

Code: Alles auswählen

Val(Right(AddImage2(i),3))
ausließt, aber andererseits garnicht sicherstellst, dass der String wirklich 3 Zeichen hat.
AddImage1(i) kann ja auch so aussehen: "255;255;1"
dann würde Right(AddImage1(i), 3) "5;1" ausgeben ...

Vllt hilft also ein RSet(Str(Red(Point(w,h))), 3, "0") oben beim lesen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: 2 Bilder miteinander verrechnen

Beitrag von MenschMarkus »

Stimmt, habe nicht bedacht, dass ein Farbwert auch nur zwei oder einstellig im String sein kann.

Habe gerade mal umgecoded mich Long Array.
Als Effekt erhalte ich jetzt kein buntes bild mehr sondern nur noch eines mit roten pixeln. Das ist sicherlich schon ein Schritt weiter, aber noch nicht das Ziel.

Hier die geänderten Codes:

Die Structure:

Code: Alles auswählen

Structure Color
    StructureUnion
        Value.l
        Chanel.a[4]
    EndStructureUnion
    StructureUnion
        Value2.l
        Chanel2.a[4]
    EndStructureUnion
EndStructure
Define Color.Color
Die Arrays:

Code: Alles auswählen

Dim AddImage1.l(Width*Height)
Dim AddImage2.l(Width*Height)
Dim ResultImage.l(Width*Height)
RGB Werte lesen:

Code: Alles auswählen

StartDrawing(ImageOutput(#Image_2))
i=1
    For h = 1 To Height-1
        For w = 1 To Width-1
            Color\Value = RGB(Red(Point(w,h)),Green(Point(w,h)),Blue(Point(w,h)))
            AddImage1(i) = Color\Value
            i+1
        Next
    Next
StopDrawing()
Bild Rechnen:

Code: Alles auswählen

Procedure.l Division(r1val.i,g1val.i,b1val.i,r2val.i,g2val.i,b2val.i)
    ; E = (256 x I) / (M + 1)   (Bilder dividieren)
    ProcedureReturn RGB((r1val * 256)/(r2val + 1),(g1val * 256)/(g2val + 1),(b1val * 256)/(b2val + 1))
EndProcedure

With Color
For i = 1 To (Width*Height)-1
    \Value = AddImage1(i)
    \Value2 = AddImage2(i)
    ResultImage(i) = Division(\Chanel[1],\Chanel[2],\Chanel[3],\Chanel2[1],\Chanel2[2],\Chanel2[3])
Next
EndWith
Bild schreiben:

Code: Alles auswählen

    StartDrawing(ImageOutput(#Image_Add))
    i=1
    For h = 1 To Height-1
        For w = 1 To Width-1
            Color\Value = ResultImage(i)
            Plot(w,h,RGB(Color\Chanel[1],Color\Chanel[2],Color\Chanel[3]))
            i+1
        Next
    Next
    StopDrawing()    
Hmmm ?
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2 Bilder miteinander verrechnen

Beitrag von STARGÅTE »

Hier die korrigierten Versionen:

Die Structure:

Code: Alles auswählen

Structure Color
    StructureUnion
        Value.l
        Chanel.a[4]
    EndStructureUnion
EndStructure
Die Arrays:

Code: Alles auswählen

Dim AddImage1.Color(Width*Height)
Dim AddImage2.Color(Width*Height)
Dim ResultImage.Color(Width*Height)
RGB Werte lesen:

Code: Alles auswählen

StartDrawing(ImageOutput(#Image_2))
i=1
    For h = 1 To Height-1
        For w = 1 To Width-1
            AddImage1(i)\Value = Point(w,h)
            i+1
        Next
    Next
StopDrawing()
Bild Rechnen:

Code: Alles auswählen

Procedure.l Division(r1val.i,g1val.i,b1val.i,r2val.i,g2val.i,b2val.i)
    ; E = (256 x I) / (M + 1)   (Bilder dividieren)
    ProcedureReturn RGB((r1val * 256)/(r2val + 1),(g1val * 256)/(g2val + 1),(b1val * 256)/(b2val + 1))
EndProcedure

For i = 1 To (Width*Height)-1
    ResultImage(i)\Value = Division(AddImage1(i)\Chanel[0],AddImage1(i)\Chanel[1],AddImage1(i)\Chanel[2],AddImage2(i)\Chanel[0],AddImage2(i)\Chanel[1],AddImage2(i)\Chanel[2])
Next
Bild schreiben:

Code: Alles auswählen

    StartDrawing(ImageOutput(#Image_Add))
    i=1
    For h = 1 To Height-1
        For w = 1 To Width-1
            Plot(w,h,ResultImage(i)\Value)
            i+1
        Next
    Next
    StopDrawing()    
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: 2 Bilder miteinander verrechnen

Beitrag von MenschMarkus »

moin moin

Prima, vielen Dank für das Update und die Code Korrektur. Mir war nicht bewusst, dass man die Stuktur sozusagen als "Algorithmus" verwenden kann. Wie komme ich jetzt darauf !?

Ich habe den Code einmal umgesetzt und erhalte umgehend eine Fehlermeldung an der Befehlsteile

Code: Alles auswählen

97  StartDrawing(ImageOutput(#Image_2))
98      i=1
99          For h = 1 To Height-1
100             For w = 1 To Width-1
101                 AddImage1(i)\Value = Point(w,h)
102                 i+1
103           Next
104       Next
105   StopDrawing()
[COMPILER]Zeile 101: Dieser Array hat keine Struktur

Das geht wohl so nicht. :|
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2 Bilder miteinander verrechnen

Beitrag von STARGÅTE »

Solange du hier keinen ganzen Code postest, der ausführbar "wäre", kann ich mit den Fehlermeldnugen nichts anfangen.
Vermutlich muss du dein Array Global machen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: 2 Bilder miteinander verrechnen

Beitrag von CSHW89 »

Ich nehme mal an, du erstellst die Arrays noch so:

Code: Alles auswählen

Dim AddImage1.l(Width*Height)
Dim AddImage2.l(Width*Height)
Dim ResultImage.l(Width*Height)
... muss aber Color als Typ haben:

Code: Alles auswählen

Dim AddImage1.Color(Width*Height)
Dim AddImage2.Color(Width*Height)
Dim ResultImage.Color(Width*Height)
lg Kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: 2 Bilder miteinander verrechnen

Beitrag von NicTheQuick »

Und noch eine andere blöde Frage. Wieso beginnt i bei 1 und nicht bei 0?
Antworten