AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Toleranzen von Farben
Thema durchsuchen
Ansicht
Themen-Optionen

Toleranzen von Farben

Ein Thema von BAMatze · begonnen am 14. Mai 2009 · letzter Beitrag vom 14. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Toleranzen von Farben

  Alt 14. Mai 2009, 09:40
Hallo und guten Morgen an alle DP´ler,

Heute mal ein ganz anderes Thema, nicht immer nur Komponenten Also ich zeichne und schreibe auf ein TBitmap mit der Farbe csBlack. Nun wollte ich zurücklesen, wieviele der Pixel in diesem TBitmap nach dem Zeichnen und Beschriften die Farbe csBlack erhalten haben. Leider stoße ich dort auf ein paar Wiedrigkeiten. Gerade bei dem Schriftteil gehen sehr viele Pixel bei der Zählung verloren, da anscheinend eine Fluktuation in den Farben der einzelnen Pixeln vorliegt.

Jetzt habe ich mehrfach zu solchen ähnlichen Themen gelesen, dass DeddyH auf Toleranzen hinweißt, die man dort beim auslesen setzen könnte, leider noch keinen Beitrag gefunden, wo dies mal umgesetzt wurde.

Hat jemand vieleicht ein Beispiel, dass mit Farbtoleranzen arbeitet oder kennt jemand ein Beispiel, wo man sieht, wie man das machen kann?

Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#2

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 09:44
Kann es sein, dass du ClearType aktiviert hast? Das würde dieses Verhalten erklären.

Dust Signs
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 09:49
Zitat von Dust Signs:
Kann es sein, dass du ClearType aktiviert hast? Das würde dieses Verhalten erklären.
Hmm das sagt mir gerade nichts, wo könnte ich das denn ausstellen, wenn ich es wollte? In der Hilfe hab ich nur was über Rendering gelesen dazu aber aktiv dies eingeschaltet, habe ich glaube nicht.
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 09:51
Eine TColor wie clBlack besteht aus 4 Byte (jeweils eins für rot, grün, blau und ein Merkmal für Systemfarben). clBlack ist AFAIK $00000000. Wenn nun beispielsweise der Rotanteil auch nur geringfügig höher ist ($00000001), greift Dein Vergleich nicht mehr. Du könntest nun also die Farbe in ihre Bestandteile zerlegen (GetRValue, GetGValue, GetBValue) und mit einfacher Prozentrechnung ermitteln, ob sich der jeweilige Anteil innerhalb einer von Dir definierten Toleranz (z.B. 5 %) befindet.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#5

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 09:53
ClearType kannst du in der Systemsteuerung deaktivieren, indem du die Kantenglättung bei Schriften auf "deaktiviert" stellst. Mehr Informationen zu ClearType findest du z.B. hier

Dust Signs
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 09:58
Zitat von DeddyH:
Eine TColor wie clBlack besteht aus 4 Byte (jeweils eins für rot, grün, blau und ein Merkmal für Systemfarben). clBlack ist AFAIK $00000000. Wenn nun beispielsweise der Rotanteil auch nur geringfügig höher ist ($00000001), greift Dein Vergleich nicht mehr. Du könntest nun also die Farbe in ihre Bestandteile zerlegen (GetRValue, GetGValue, GetBValue) und mit einfacher Prozentrechnung ermitteln, ob sich der jeweilige Anteil innerhalb einer von Dir definierten Toleranz (z.B. 5 %) befindet.
Das hört sich schonmal sehr gut an. Werde ich gleich mal versuchen einzubauen. Folgendes habe ich auch gefunden auch dieser Seite. Ähm ja anscheinend versucht er ja auch mit
if abs(bm1.canvas.pixels[i,j] - bm2.canvas.pixels[i,j]) < 20 then die Unterschiede der Farben einzugehen. Ich hab mir dazu mal ein kleines Programm geschrieben und es an einem einzigen Buchstaben getestet und das geht total in die Hose. Bis zu einem Unterschied von 2 gibt er immer das gleiche aus (natürlich das falsche) und bei 1 gibt er was anderes aus (aber auch flasch). Kann natürlich immer noch sein, dass ich da was flasch verstanden habe. Das nurmal als Einwurf.

Jetzt zu GetRValue, ...
2. Account Sero
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#7

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 10:18
Moin,
in dem letzten Beispiel wird der Farbunterschied von Pixeln identischer Koordinate in zwei verschiedenen Bitmaps ausgewertet. In deinem Fall geht es doch aber wohl um die Abweichung von einem Sollwert, oder?
Ralph
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 10:28
Zitat von taaktaak:
Moin,
in dem letzten Beispiel wird der Farbunterschied von Pixeln identischer Koordinate in zwei verschiedenen Bitmaps ausgewertet. In deinem Fall geht es doch aber wohl um die Abweichung von einem Sollwert, oder?
Ja richtig. Hab dazu auch mal schnell ein kleines Testprogramm geschrieben. Allerdings ist das Ergebnis schon etwas überraschend. Also obwohl ich ihm eigentlich anweise mit der Farbe clBlack zu schreiben, weichen die meisten Pixelwerte sehr stark vom RGB-Wert (0,0,0) ab. Teilweise sind diese Abweichungen > als 100 Farbstufen in einem der RGB-Bereiche.

Allerdings muss ich jetzt auch sagen, ich versuche ein sehr kleinen Buchstaben zu "scannen".
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 10:35
Ich habe mal schnell eine Funktion geschrieben (für Fehlerfreiheit und Performance übernehme ich allerdings kein Garantie):
Delphi-Quellcode:
function SimilarColors(FirstColor, SecondColor: TColor;
                       Percentage: byte = 5): Boolean;

    function ColorInRange(first, second: byte): Boolean;
    begin
      Result := abs(first - second) <= Round(MAXBYTE / 100 * Percentage);
    end;

var R1,R2,G1,G2,B1,B2: byte;
begin
  R1 := GetRValue(FirstColor);
  R2 := GetRValue(SecondColor);
  G1 := GetGValue(FirstColor);
  G2 := GetGValue(SecondColor);
  B1 := GetBValue(FirstColor);
  B2 := GetBValue(SecondColor);
  Result := ColorInRange(R1,R2) and ColorInRange(G1,G2) and ColorInRange(B1,B2);
end;
In kurzen Tests sah das ganz gut aus, aber ich kann mich auch irgendwo verrechnet haben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#10

Re: Toleranzen von Farben

  Alt 14. Mai 2009, 11:09
Zitat von BAMatze:
... Also obwohl ich ihm eigentlich anweise mit der Farbe clBlack zu schreiben, weichen die meisten Pixelwerte sehr stark vom RGB-Wert (0,0,0) ab. Teilweise sind diese Abweichungen > als 100 Farbstufen in einem der RGB-Bereiche.
.
Hallo,

das ist logisch, wenn richtig gerendert wurde. Am Rand (des Buchstabens z.B.) wird nämlich die Farbe proportional zur belegten Pixelfläche interpoliert zwischen Buchstabenfarbe und Hintergrund. Gehört z.B. die Häfte des Pixels zu einem schwarzen Buchstaben auf weissem Grund, so erhält das Pixel ein 50% grau. Das heisst EBEN NICHT, dass es sich um ein graues Pixel handelt, sondern dass an diese Stelle eigentlich ein halbes weisses und ein halbes schwarzes Pixel gehört.

Daraus ist zu entnehmen, dass die Abweichung beliebig gross sein kann, im Beispiel 50%, und dass das auch völlig korrekt ist.

Gruss Reinhard

Nachtrag:

a das Ergebnis hängt also auch vom Hintergrund ab.

b um etwa einen Buchstaben zu löschen, müsste man alle Pixel zurücksetzen, die sich vom Hintergrund unterscheiden, auch wenn sie im Beispiel nur 10% grau sind - sonst bleibt ein grauer Schatten übrig.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz