Seite 2 von 2

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 13:52
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 ?

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 13:56
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!

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 14:25
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!

Re: 2 Bilder miteinander verrechnen

Verfasst: 28.04.2013 21:15
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

Re: 2 Bilder miteinander verrechnen

Verfasst: 29.04.2013 21:14
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