Farben auf eine feste Palette mappen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Farben auf eine feste Palette mappen

Beitrag von dige »

Hi, möchte gern einen Bildvergleich über den Farbanteil eines Bilder ausprobieren.
Meine Idee ist, eine feste Palette mit 8 Farben vorzugeben.
(Schwarz - Blau - Grün - Türkis - Rot - Mangenta - Gelb - Weis)

Das Bild wird also Pixelweise ausgelesen und die Farbe soll einem der obigen Farben
zugeordnet werden und ein Counter erhöht werden.

Mein Problem ist die Zuordnung. Von Deeem habe ich einen alten ASM Code gefunden
der die Differenz von 2 Farben ermittelt:

Code: Alles auswählen

Procedure   ColorDiff(c1,c2) ;-ASM Color Differnce by Deem
  ; DisableDebugger
  
  !MOV Ecx,[p.v_c1]
  !MOV Edx,[p.v_c2]
  
  !SUB cl,dl
  !JNC .no_carry_1
  !NEG cl
  !.no_carry_1:
  !SUB ch,dh
  !JNC .no_carry_2
  !NEG ch
  !.no_carry_2:
  
  !ROR Ecx,16
  !ROR Edx,16
  
  !SUB cl,dl
  !JNC .no_carry_3
  !NEG cl
  !.no_carry_3:
  
  !XOR Ebx,Ebx
  !MOV bl,cl
  !MOV Eax,Ebx
  !MOV bl,ch
  !ADD Eax,Ebx
  !SHR Ecx,16
  !MOV bl,cl
  !ADD Eax,Ebx
  !MOV bl,ch
  !ADD Eax,Ebx
  
  ProcedureReturn
EndProcedure
Und jetzt hängt sich gerade mein kleine graue Zelle auf :-( ... bitte gebt mir mal einen Schubs in welche
Richtung ich denken muss... Danke!
"Papa, ich laufe schneller - dann ist es nicht so weit."
jamirokwai
Beiträge: 65
Registriert: 02.06.2008 16:10

Re: Farben auf eine feste Palette mappen

Beitrag von jamirokwai »

Hi,

ich würde hier den Farbcode anhand Rot, Grün und Blau vergleichen.

Wenn Du also ein Blau haben willst, das $0000FF als Code hätte, ein gesättigtes Blau. Du holst die Farbe des Pixels aus dem Bild. Wenn der Wert $0000FF wäre, hättest Du bereits die korrekte Zuweisung. Für jede Farbe kannst Du nun Schwellenwerte einbauen, z.B. für $0000FF-Blau, dass Rot und Grün nicht über $22 sein dürfen und dass Blau nicht unter $CC sein darf. Das geht wohl mit Red(), Green(), Blue(). Ein Wert wie $2121CD wäre also dem Blau von oben zuzuweisen. Es ist wichtig, die Einzelfarbanteile zu vergleichen.

Hoffe, das war verständlich :-)

Gruß
J.
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: Farben auf eine feste Palette mappen

Beitrag von NicTheQuick »

Ich würde das Bild zunächst in den HSV-Farbraum konvertieren. Fertige Codes gibt es dafür schon hier im Forum. Dann hat man pro Pixel die entsprechende Grundfarbe und das mit den Schwellwerten wird dann um einiges leichter.
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Farben auf eine feste Palette mappen

Beitrag von dige »

NicTheQuick hat geschrieben:Ich würde das Bild zunächst in den HSV-Farbraum konvertieren. Fertige Codes gibt es dafür schon hier im Forum. Dann hat man pro Pixel die entsprechende Grundfarbe und das mit den Schwellwerten wird dann um einiges leichter.
Stimmt, das mit dem HSV ist ne gute Idee. Hast Du grad
einen Link auf einen gut optimierten Code oder eine
ASM Variante?

Danke und Ciao, Dige
"Papa, ich laufe schneller - dann ist es nicht so weit."
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: Farben auf eine feste Palette mappen

Beitrag von NicTheQuick »

Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Farben auf eine feste Palette mappen

Beitrag von Thorium »

Ich hatte mal das gleiche Problem und Stargate hatte mir nen einfachen Code gepostet, der zuverlässig die Farbähnlichkeit prüft: http://www.purebasic.fr/german/viewtopi ... =4&t=17720

Hatte das genutzt um Bilder zu einer festen 4bit Palette zu konvertieren.

Für das zuweisen zum Palettenindex hatte ich diesen Code geschrieben.

Code: Alles auswählen

StartDrawing(ImageOutput(Img))

For y = 0 To 31

  For x = 0 To 31

    ImgColor = Point(x,y)
    
    Found = 0

    OldDistance = $0FFFFFFF

    For i = 0 To 255
    
      If Pal(i) <> $FFFFFFFF
        
        Distance = DistanceRGB(ImgColor,Pal(i))
        
        If Distance = 0
          Found = 1
          WriteByte(RawFile,i & $00FF)
          Break
        EndIf
        
        If Distance < OldDistance
          OldDistance = Distance
          RawIndex = i
        EndIf
        
      EndIf

    Next
    
    If Found = 0
      WriteByte(RawFile,RawIndex & $00FF)
      ChangeCnt + 1
    EndIf

  Next

Next
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten