Hi Folks,
ich habe momentan ein ziemliches Problem mit diversen Images (>15000) und eventuellen dazugehörigen redundaten Images, welche hier in dem JPG Format vorliegen.
Bei näherer Betrachtung dachte ich mir hier eine eigene Lösung anzustreben, welche mir zum ersten einmal 100% identische Bilder herausfiltert und anzeigt - quasi Pixel für Pixel - und im nächsten Schritt mir die Bilder aufzeigt, welche zum Original eine Ähnlichkeit aufweisen und auch nur alles mit einer Ähnlichkeit von größer 75% betrachtet.
Degrees, in Form von 90Grad | 180Grad | 270Grad Drehungen lasse ich komplett aus der Berechnung, ebenso wie die Betrachtung von Teilausschnitten.
An dieser Stelle sei gesagt dass ich mir bewusst bin nicht die Größe von Google zu haben, um solch eine komplexe Thematik zu lösen. Das Verständnis der Problematik, sowie eine angestrebte Lösung hierzu, sollte aber doch zu schaffen sein. Zurückgreifen möchte ich auf PHP, da ich mich hier zuhause fühle und die Sprache ebenfalls dafür geeignet ist.
Wie stelle ich mir das vor ...
Zuallererst möchte ich jedes Bild für sich analysieren und Metadaten hierzu in einer Datenbank erfassen.
Das bedeutet ich erstelle zu erst ein Histogramm aus dem Orginalen Bild und komprimiere das Bild im Anschluss auf 32x32 Pixel und erstelle hier ebenfalls ein Histogramm. Die Komprimierung auf 32 Pixel sorgt zum einen für eine schneller Verarbeitung und zum Zweiten werden dadurch kleinere Unterschiede "weg komprimiert". Die Zahlenfolgen, der jeweiligen Histogramme kommen in die DB.
Um einen Abgleich der Bilder durchführen zu können setze ich nun den Graufilter ein und erhalte hier eine Abstufung der jeweiligen Farbinformation.
Jetzt berechne ich mir den Schwellwert des Bildes über die Graustufen, in der Annahme das eine Graustufe immer die gleiche Farbinformation von RGB->r == RGB->g == RGB->b hat. Beispiel ==> RGB(234,234,234) oder RGB(245,245,245)
Unter dieser Betrachtung wird dann jeder einzelne Farbwert der Grafik miteinander addiert und durch die Gesamtpixelanzahl geteilt.(siehe Beispiel1).
Beispiel 1:
Im zweiten Durchlauf betrachte ich dann jeden Pixel für sich und erstelle mir aus der gewonnen Information den binären String
Um das Ganze hier später übergreifend Binär abgleichen zu können schreibe ich diesen Binärstring ebenfalss in die DB. Bei einem direkten Vergleich von BIT für BIT (Grafik zu Grafik) kann ich mir über den Fehlerwert eine prozentuale Übereinstimmung ausrechnen und hier alles was einen Wert von über 75% hat als ähnlich markieren.
Liege ich bis hierher absolut daneben oder wäre das ein kleiner plausibler Ansatz?
Im nächsten Durchlauf möchte ich mir den DCT (diskrete Kosinustransformation) Wert der JPG Datei ermitteln und hier ebenfalls eine Abgleich zu tätigen, ich weis bisher nur noch nicht ob das zum gewünschtenErfolg führt, da ich den Ansatz für einen Vergleich noch nicht verstehe, habe aber ein gutes Beispiel im Netz gefunden und konnte mir hierzu die jeweiligen 8x8 Werte errechnen...
Was kann ich mir noch für eine Vergleich heranziehen, bzw. welche Informationen sind wichtig/hilfreich?
Über Anregungen, bzw. Hilfestellung wäre ich dankbar
ich habe momentan ein ziemliches Problem mit diversen Images (>15000) und eventuellen dazugehörigen redundaten Images, welche hier in dem JPG Format vorliegen.
Bei näherer Betrachtung dachte ich mir hier eine eigene Lösung anzustreben, welche mir zum ersten einmal 100% identische Bilder herausfiltert und anzeigt - quasi Pixel für Pixel - und im nächsten Schritt mir die Bilder aufzeigt, welche zum Original eine Ähnlichkeit aufweisen und auch nur alles mit einer Ähnlichkeit von größer 75% betrachtet.
Degrees, in Form von 90Grad | 180Grad | 270Grad Drehungen lasse ich komplett aus der Berechnung, ebenso wie die Betrachtung von Teilausschnitten.
An dieser Stelle sei gesagt dass ich mir bewusst bin nicht die Größe von Google zu haben, um solch eine komplexe Thematik zu lösen. Das Verständnis der Problematik, sowie eine angestrebte Lösung hierzu, sollte aber doch zu schaffen sein. Zurückgreifen möchte ich auf PHP, da ich mich hier zuhause fühle und die Sprache ebenfalls dafür geeignet ist.
Wie stelle ich mir das vor ...
Zuallererst möchte ich jedes Bild für sich analysieren und Metadaten hierzu in einer Datenbank erfassen.
Das bedeutet ich erstelle zu erst ein Histogramm aus dem Orginalen Bild und komprimiere das Bild im Anschluss auf 32x32 Pixel und erstelle hier ebenfalls ein Histogramm. Die Komprimierung auf 32 Pixel sorgt zum einen für eine schneller Verarbeitung und zum Zweiten werden dadurch kleinere Unterschiede "weg komprimiert". Die Zahlenfolgen, der jeweiligen Histogramme kommen in die DB.
Um einen Abgleich der Bilder durchführen zu können setze ich nun den Graufilter ein und erhalte hier eine Abstufung der jeweiligen Farbinformation.
Jetzt berechne ich mir den Schwellwert des Bildes über die Graustufen, in der Annahme das eine Graustufe immer die gleiche Farbinformation von RGB->r == RGB->g == RGB->b hat. Beispiel ==> RGB(234,234,234) oder RGB(245,245,245)
Unter dieser Betrachtung wird dann jeder einzelne Farbwert der Grafik miteinander addiert und durch die Gesamtpixelanzahl geteilt.(siehe Beispiel1).
Beispiel 1:
Code:
// Schwellwert ermitteln
for ($i = 0; $i < $imgw; $i ++) {
for ($j = 0; $j < $imgh; $j ++) {
$rgb = imagecolorat($im, $i, $j);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$schwellwert += (int)round(($r + $g + $b) / 3);
$V = (int)round(($r + $g + $b) / 3);
$histo[$V] += $V / $n;
}
}
$schwellwert = $schwellwert / ( $imgw * $imgh );
Im zweiten Durchlauf betrachte ich dann jeden Pixel für sich und erstelle mir aus der gewonnen Information den binären String
Code:
...
if ((($r+$g+$b)/3) > $schwellwert)
{
$binaer[] = 1;
}
else
{
$binaer[] = 0;
}
...
Um das Ganze hier später übergreifend Binär abgleichen zu können schreibe ich diesen Binärstring ebenfalss in die DB. Bei einem direkten Vergleich von BIT für BIT (Grafik zu Grafik) kann ich mir über den Fehlerwert eine prozentuale Übereinstimmung ausrechnen und hier alles was einen Wert von über 75% hat als ähnlich markieren.
Liege ich bis hierher absolut daneben oder wäre das ein kleiner plausibler Ansatz?
Im nächsten Durchlauf möchte ich mir den DCT (diskrete Kosinustransformation) Wert der JPG Datei ermitteln und hier ebenfalls eine Abgleich zu tätigen, ich weis bisher nur noch nicht ob das zum gewünschtenErfolg führt, da ich den Ansatz für einen Vergleich noch nicht verstehe, habe aber ein gutes Beispiel im Netz gefunden und konnte mir hierzu die jeweiligen 8x8 Werte errechnen...
Was kann ich mir noch für eine Vergleich heranziehen, bzw. welche Informationen sind wichtig/hilfreich?
Über Anregungen, bzw. Hilfestellung wäre ich dankbar