Seite 1 von 2

2 Bilder miteinander verrechnen

Verfasst: 27.04.2013 21:38
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()    

Re: 2 Bilder miteinander verrechnen

Verfasst: 27.04.2013 23:30
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]

Re: 2 Bilder miteinander verrechnen

Verfasst: 27.04.2013 23:47
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.

Re: 2 Bilder miteinander verrechnen

Verfasst: 27.04.2013 23:54
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.

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 00:42
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 ?

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 01:08
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()    

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 08:18
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. :|

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 10:28
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.

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 10:37
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

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 13:24
von NicTheQuick
Und noch eine andere blöde Frage. Wieso beginnt i bei 1 und nicht bei 0?