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

Re: 2 Bilder miteinander verrechnen

Beitrag von MenschMarkus »

@kevin
Korrekt, hatte ich nicht geändert.
Codeoptimierung soweit durch. Jetzt zum eigentlichen Problem, das Ergebnis

@NickTheQuick
Macht der Gewohnheit :)

Ich nutze folgende 2 Bilder:

Bild1 : Edit: 29.04.2013 Bilder wurden aus Dropbox gelöscht!
Bild2 : Für die Nutzung des Codes können beliebige möglichst gleiche
jpg Bilder verwendet werden ! gez. menschmarkus
und erhalte folgendes Ergebnis
Divided:

Und das wäre was ich erwarte
ZielBild:

Eine Idee wo mein Fehler liegt ?
Zuletzt geändert von MenschMarkus am 29.04.2013 21:06, insgesamt 1-mal geändert.
Wissen schadet nur dem, der es nicht hat !
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 »

Naja, wie Stargate schon sagte. Zeig uns doch bitte mal deinen kompletten Code ohne ihn in einzelne Stückchen aufzuteilen, damit wir ihn direkt ausführen können und ihn selbst wieder zusammenbasteln zu müssen. Dann ist es viel leichter zu helfen!
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 »

OK kommt in Kürze.
will erst noch mal was testen.

Edit Nachtrag:

Zwischen dem Laden der einzelnen Bilder habe ich einen Delay eingebaut, dass man sehen kann welche Bilder geladen werden

so, hier der Code:

Code: Alles auswählen

Enumeration 
    #Window_0
EndEnumeration
Enumeration
    #ImageGadget_1
EndEnumeration
Enumeration
    #Image_1
    #Image_2
    #Image_Add
EndEnumeration

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

Define Color.Color

device = 0
Width = 1920
Height = 1080
dWidth = Width/2.3
dHeight = Height/2

Dim AddImage1.Color(Width*Height)
Dim AddImage2.Color(Width*Height)
Dim ResultImage.Color(Width*Height)

dest = AllocateMemory(Width*Height)
destLen = MemorySize(dest)

CreateImage(#Image_1, Width, Height)
CreateImage(#Image_2, Width, Height)
CreateImage(#Image_Add,Width,Height)

UseJPEGImageDecoder()
UseJPEGImageEncoder()

Procedure.l Multiply(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    ; E = (M x I) / 255    (Bilder Multiplizieren)  Quelle: http://docs.gimp.org/de/gimp-concepts-layer-modes.html
    ProcedureReturn RGB((r1val * r2val)/255,(g1val * g2val)/255,(b1val * b2val)/255)
EndProcedure
Procedure.l Division(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    ; E = (256 x I) / (M + 1)   (Bilder dividieren)
    ProcedureReturn RGB((r1val * 256)/(r2val + 1),(g1val * 256)/(g2val + 1),(b1val * 256)/(b2val + 1))
EndProcedure

  OpenWindow(#Window_0, 0, 0, dWidth, dHeight+30, name$, #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  ImageGadget(#ImageGadget_1, 0, 0,dWidth, dHeight, ImageID(#Image_1));ImageID(image))
  LoadImage(#Image_1,"_Image1.jpg")
  SetGadgetState(#ImageGadget_1,ImageID(#Image_1))
  StartDrawing(ImageOutput(#Image_1))
  i=1
  For h = 1 To dHeight-1
      For w = 1 To dWidth-1
          AddImage1(i)\Value = Point(w,h)
          i+1
      Next
  Next
  StopDrawing()
  Delay(3000)
  LoadImage(#Image_1,"_Image2.jpg")
  SetGadgetState(#ImageGadget_1,ImageID(#Image_1))
  StartDrawing(ImageOutput(#Image_1))
  i=1
  For h = 1 To dHeight-1
      For w = 1 To dWidth-1
          AddImage2(i)\Value = Point(w,h)
          i+1
      Next
  Next
  StopDrawing()
  Delay(3000)
  For i = 1 To (dWidth*dHeight)-1
      ResultImage(i)\Value = Division(AddImage1(i)\Chanel[1],AddImage1(i)\Chanel[2],AddImage1(i)\Chanel[3],AddImage2(i)\Chanel[1],AddImage2(i)\Chanel[2],AddImage2(i)\Chanel[3])
      ;ResultImage(i)\Value = Multiply(AddImage1(i)\Chanel[1],AddImage1(i)\Chanel[2],AddImage1(i)\Chanel[3],AddImage2(i)\Chanel[1],AddImage2(i)\Chanel[2],AddImage2(i)\Chanel[3])
  Next
  StartDrawing(ImageOutput(#Image_Add))
  i=1
  For h = 1 To dHeight-1
      For w = 1 To dWidth-1
            Plot(w,h,ResultImage(i)\value)
          i+1
      Next
  Next
  StopDrawing()    
  SetGadgetState(#ImageGadget_1,ImageID(#Image_Add))

  Repeat
      Event = WaitWindowEvent()
      Select Event
          Case #PB_Event_CloseWindow
              Break
      EndSelect
  ForEver
  End         
Multiplizieren funktioniert besser, aber auch nicht so wie es soll. Das bild ist viel zu gelb!
Wissen schadet nur dem, der es nicht hat !
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 »

Problem gelöst !
Genauer gesagt die 2 Probleme gelöst :D

Problem 1 war: ich habe chanels mit 1 beginnend ausgelesen, nicht mit 0 beginnend
Problem 2 war: Im Algorithmus konnte es passieren, dass der Wert >255 wird. Nach Änderung der Procedure funzt es.

Code: Alles auswählen

Procedure.l Division(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    ; E = (256 x I) / (M + 1)   (Bilder dividieren)
    calculatedR = (r1val*256)/(r2val+1)
    If calculatedR > 255 : calculatedR = 255 : EndIf
    calculatedG = (g1val*256)/(g2val+1)
    If calculatedG > 255 : calculatedG = 255 : EndIf
    calculatedB = (b1val*256)/(b2val+1)
    If calculatedB > 255 : calculatedB = 255 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure
Ich Dank Euch für Eure Vorschläge und Ideen

lg
menschmarkus
Wissen schadet nur dem, der es nicht hat !
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 »

Hier noch einige weitere Möglichkeiten der Berechnungen von 2 Bildern:
Quelle: http://docs.gimp.org/de/gimp-concepts-layer-modes.htm

Code: Alles auswählen

Procedure.l Multiply(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    calculatedR = (r1val * r2val)/255
    If calculatedR > 255 : calculatedR = 255 : EndIf
    calculatedG = (g1val * g2val)/255
    If calculatedG > 255 : calculatedG = 255 : EndIf
    calculatedB = (b1val * b2val)/255
    If calculatedB > 255 : calculatedB = 255 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure

Procedure.l Division(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    calculatedR = (r1val*256)/(r2val+1)
    If calculatedR > 255 : calculatedR = 255 : EndIf
    calculatedG = (g1val*256)/(g2val+1)
    If calculatedG > 255 : calculatedG = 255 : EndIf
    calculatedB = (b1val*256)/(b2val+1)
    If calculatedB > 255 : calculatedB = 255 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure

Procedure.l Bildschirm(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    calculatedR = 255-(((255-r1val)*(255-r2val))/255)
    If calculatedR > 255 : calculatedR = 255 : EndIf
    calculatedG = 255-(((255-g1val)*(255-g2val))/255)
    If calculatedG > 255 : calculatedG = 255 : EndIf
    calculatedB = 255-(((255-b1val)*(255-b2val))/255)
    If calculatedB > 255 : calculatedB = 255 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure

Procedure.l Addition(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    calculatedR = r1val+r2val
    If calculatedR > 255 : calculatedR = 255 : EndIf
    calculatedG = g1val+g2val
    If calculatedG > 255 : calculatedG = 255 : EndIf
    calculatedB = b1val+b2val
    If calculatedB > 255 : calculatedB = 255 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure

Procedure.l Subtraction(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    calculatedR = r1val-r2val
    If calculatedR < 0 : calculatedR = 0 : EndIf
    calculatedG = g1val-g2val
    If calculatedG < 0 : calculatedG = 0 : EndIf
    calculatedB = b1val-b2val
    If calculatedB < 0 : calculatedB = 0 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure

Procedure.l Overlay(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    calculatedR = (r2val/255)*(r2val+((2*r1val)/255)*(255-r2val))
    If calculatedR > 255 : calculatedR = 255 : EndIf
    calculatedG = (g2val/255)*(g2val+((2*g1val)/255)*(255-g2val))
    If calculatedG > 255 : calculatedG = 255 : EndIf
    calculatedB = (b2val/255)*(b2val+((2*b1val)/255)*(255-b2val))
    If calculatedB > 255 : calculatedB = 255 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure

Procedure.l FaserExtract(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    calculatedR = r2val-r1val+128
    If calculatedR > 255 : calculatedR = 255 : EndIf
    calculatedG = g2val-g1val+128
    If calculatedG > 255 : calculatedG = 255 : EndIf
    calculatedB = b2val-b1val+128
    If calculatedB > 255 : calculatedB = 255 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure

Procedure.l FaserMix(r1val.a,g1val.a,b1val.a,r2val.a,g2val.a,b2val.a)
    Protected calculatedR.i, calculatedG.i, calculatedB.i
    calculatedR = r2val+r1val-128
    If calculatedR > 255 : calculatedR = 255 : EndIf
    calculatedG = g2val+g1val-128
    If calculatedG > 255 : calculatedG = 255 : EndIf
    calculatedB = b2val+b1val-128
    If calculatedB > 255 : calculatedB = 255 : EndIf
    ProcedureReturn RGB(calculatedR,calculatedG,calculatedB)
EndProcedure
lg
menschmarkus
Wissen schadet nur dem, der es nicht hat !
Antworten