• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Farbähnlichkeit

Status
Für weitere Antworten geschlossen.

vit_o

Neues Mitglied
Moin moin,
wie krieg ich raus, ob die farbe eines pixel ähnliche ist wie eine vorgegebene farbe?

brauche das für eine funktion die bei einem bild den weißen rand abschneidet, leider sind das gescannte bilder und weisen an einigen stellen farbabweichung auf.

das ich den farbwert eines pixel mit
Code:
 imagecolorat($image, $x, $y);
bestimmen kann weiß ich.

thx im voraus
 
Zuletzt bearbeitet:
Werbung:
Auf PHP: imagecolorat - Manual steht folgender Code in einem Benutzerkommentar:
PHP:
  $pixelrgb = imagecolorat($source,$x,$y);
  $cols = imagecolorsforindex($source, $pixelrgb);
  $r = $cols['red'];
  $g = $cols['green'];
  $b = $cols['blue'];

Wenn das funktioniert (habe es nicht getestet), berechne doch die Summe der Quadrate der Abweichung von 255 und vergleiche sie mit einem Schwellenwert.

Gruß
Junny
 
sollte funktionieren ^^

PHP:
<?php

$img = imagecreatefrompng("http://www.page.tld/source.png");

// den farbwert hohlen
$pixelrgb = imagecolorat($source,1,1);

// diesen in ein RGB array umwandeln
$color1 = imagecolorsforindex($source, $pixelrgb);

// vergleichsfarbe bestimmen
$color2 = array( // Rot
    'red'   => 255,
    'green' => 0,
    'blue'  => 0
);

if(is_aehnlich($color1, $color2, 95)) {
    echo 'ähnlichkeit 95% oder mehr.';
} elseif(is_aehnlich($color1, $color2, 80)) {
    echo 'ähnlichkeit 80% oder mehr.';
} else {
    echo 'nicht so ähnlich ^^';
}

/**
 * @param array | RGB $color1
 * @param array | RGB $color2
 * @param int   |  %  $mind_aehnlichkeit
 */
function is_aehnlich(array $color1, array $color2, $mind_aehnlichkeit=95/* % */) {
    $check = (boolean)(
        isset($color1['red'])   &&
        isset($color1['green']) &&
        isset($color1['blue'])  &&
        isset($color2['red'])   &&
        isset($color2['green']) &&
        isset($color2['blue'])
    );
    if(!$check) {
        trigger_error("Bad function call!", E_USER_ERROR);
        return false;
    }
    
    $check = (boolean)(
        $mind_aehnlichkeit <= (int)((
            255 / 100 * diff($color1['red'], $color2['red']) +
            255 / 100 * diff($color1['green'], $color2['green']) +
            255 / 100 * diff($color1['blue'], $color2['blue'])) /
            3 
        )
    );
    
    return $check;
}

function diff($wert1, $wert2) {
    return max($wert1, $wert2) - min($wert1, $wert2);
}

?>
 
Werbung:
Nimm besser die Wurzel aus der Summe der Quadrate der Differenzen der Farbwerte, das lässt hohe Unterschiede mehr ins Gewicht fallen als kleine. Und willst du nicht eher mit 100/255 multiplizieren?


Und ohnehin: Wären bei dir die Differenzen allesamt gleich null, so wäre nur bei einer Ähnlichkeit von 0% true zurückgegeben worden ;)


/Edit:
PHP:
$check =  ($mind_aehnlichkeit <= (1 - sqrt(
    pow($color1['red'] - $color2['red'], 2) +
    pow($color1['green'] - $color2['green'], 2) + 
    pow($color1['blue'] - $color2['blue'], 2)) * 100 / 255));
(ungetestet)
 
Zuletzt bearbeitet von einem Moderator:
var $check... WTF!? o_O
entweder verschrieben weil du den ganzen tag in JavaScript oder ähnlichem gearbeitet hast oder aber hoffentlich nicht absichtlich geschrieben ^^
 
Werbung:
@Slibbo, da ist nichts verschrieben, var gibts auch in php... schau in der referenz(!)...

zwar ist es unnötig in diesem kontext, aber für klassen druchaus sinnvoll. :D
 
var ist veraltet und sollte nicht mehr genutzt werden. ^^ mehr muss man nicht sagen oder? ^^

//Edit: und "var" war nie sinnvoll ;)
 
Werbung:
Es ist aber ein schritt in die falsche Richtung wenn du hier so öffentlich postest das var im umgang mit OOP sinvoll ist ;)
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben