Portal > Foren > PHP > PHP-Programmierung > Meistbenutzte Farben eines Bildes
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 10.07.2006, 22:19 Nach oben    #1
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard Meistbenutzte Farben eines Bildes

Abend,
nun, ich hab mir mal Gedanken über folgende Funktoin gemacht:
http://www.photostock.de/search/?q=color:006fb8

Hier kann man links die gesuchte Farbe eingeben, und rechts werden Bilder in der Farbkategorie gesucht.
Nun, auf Anfragen wollen diese Seiten nie antworten - also versuch ich mit euch eine Lösung dafür zu finden.

Nur wie realisier ich diese Funktion?
Bisher sieht mein Ansatz ja noch ziemlich mager aus:
PHP-Code:
<?php
$iStep 
10;
$rImage imageCreateFromJPEG($sFile);
$iMaxX imageSX($rImage);
$iMaxY imageSY($rImage);

for(
$iX 0$iX $iMaxX$iX += $iStep) {
        for(
$iY 0$iY $iMaxY$iY += $iStep) {
                
$aColors imagecolorsforindex($rImageimagecolorat($rImage$iX$iY));
        }
}
?>
Das wars bisher. Wie könnte ich solch einen Algorhitmus realisieren, möglichst Resourcenschonend? Ich denke, eine Möglichkeit um Resourcen zu schonen wäre, dass man eine Genauigkeit angeben könnte, nach der das Bild dann erstmal verkleinert wird..?
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (10.07.2006 um 22:29 Uhr)
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 00:54 Nach oben    #2
axo
Gast
 
Beiträge: n/a
Standard

hmmm.... wenn man ein beliebiges bild auf 1x1 px größe runterskaliert und dann den farbwert des übriggebliebenen pixels misst - wie nah ist man dann am gewünschten ergebnis?

cya
axo
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 07:47 Nach oben    #3
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 596
Standard

Nanu, gab es die Frage nicht erst im anderen PHP-Forum ?
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 12:44 Nach oben    #4
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von CIX88
Nanu, gab es die Frage nicht erst im anderen PHP-Forum ?
In welchem?
Zitat:
hmmm.... wenn man ein beliebiges bild auf 1x1 px größe runterskaliert und dann den farbwert des übriggebliebenen pixels misst - wie nah ist man dann am gewünschten ergebnis?

cya
axo
Hm. Es soll ja nach Möglichkiet mehrere Farben rauskommen, z.B. Blau und Rot (wenn das die Hauptfarben sind), der Grün Gelb und Lila (eben je nach Auftreten, aber das ist ja erstmal Nebensache).
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 12:56 Nach oben    #5
Wikinger
 
Benutzerbild von xardias
 
Registriert seit: 02.03.2006
Ort: Aachen
Beiträge: 179
Standard

wie wäre es wenn du die einzelnen komponenten aller Pixel jeweils addierst.
dann hast du zum schluss Werte wie viel Rot, grün und Blau im Bild ist.

Alles andere wird schwierig, da du ja irgendwo grenzen Festlegen musst, z.b. wann ist pink kein pink mehr sondern rosa, etc.
xardias ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 13:11 Nach oben    #6
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
wie wäre es wenn du die einzelnen komponenten aller Pixel jeweils addierst.
dann hast du zum schluss Werte wie viel Rot, grün und Blau im Bild ist.
Schon dran gedacht, nur wann hab ich dann z.b. viel Gelb im Bild, oder Braun?

Zitat:
Alles andere wird schwierig, da du ja irgendwo grenzen Festlegen musst, z.b. wann ist pink kein pink mehr sondern rosa, etc.
Ich lasse das per HEX ausgeben, bennen muss ich die Farben nicht, das ist nicht das Problem.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 13:14 Nach oben    #7
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

Trotzdem brauchst du Tolleranzgrenzen. Denn in einem Schwarzen Bild muss nicht jeder Pixel 000 sein, sondern es könnte auch mal ein 001 etc drin sein. rein optisch wäre es aber immer noch schwarz.

Also an sich könntest du rausfiltern, wie oft welcher Hex vorkommt und dann eine "nachbarschafts"analyse bauen.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 13:16 Nach oben    #8
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

An die Toleranzgrenzen hab ich auch schon gedacht - da werd ich dann noch etwas mit Hex bzw RGBWerten spielen und welche setzen, auch hier wäre aber ein Algorhitmus sehr hilfreich, das gehört auch zu meiner Huaptfrage oben..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 14:58 Nach oben    #9
Benutzer
 
Registriert seit: 12.12.2005
Beiträge: 49
Standard

Zitat:
hmmm.... wenn man ein beliebiges bild auf 1x1 px größe runterskaliert und dann den farbwert des übriggebliebenen pixels misst - wie nah ist man dann am gewünschten ergebnis?
Zitat:
Hm. Es soll ja nach Möglichkiet mehrere Farben rauskommen, z.B. Blau und Rot (wenn das die Hauptfarben sind), der Grün Gelb und Lila (eben je nach Auftreten, aber das ist ja erstmal Nebensache).
Also ich grad mal ein paar Bilder mit Fotoshop auf 3x3 Pixel verkleinert... Naja bis jetzt sind wirklich nur die Hauptfarben zu sehen gewesen!
Vieleicht mal ausprobieren...
__________________
Gruß
code5
code5 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 15:44 Nach oben    #10
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Vieleicht mal ausprobieren...
Hab ich gemacht.
Zitat:
Zitat von axo
hmmm.... wenn man ein beliebiges bild auf 1x1 px größe runterskaliert und dann den farbwert des übriggebliebenen pixels misst - wie nah ist man dann am gewünschten ergebnis?

cya
axo
Woha.
Geniale Idee, danke, scheint zu fukntionieren!
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 21:16 Nach oben    #11
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 596
Standard

Hmm, bei phpfriend.de gab es wohl ein ähnliches Thread.

Ich hatte nur mal kurz damit rumgespielt:
http://www.cix88.de/cix_php/tonne/test.php
http://www.cix88.de/cix_php/tonne/test2.php

Das Problem mit den Tolleranzgrenzen habe ich beim 2.Beispiel versucht.

PHP-Code:
// basis 7, 15 ... 127
$r round(round($r/255*$basis)/$basis*255);
$g round(round($g/255*$basis)/$basis*255);
$b round(round($b/255*$basis)/$basis*255); 
Mit dem verkleinern auf 3x3 px hatte ich allerdings noch nicht probiert.

Geändert von CIX88 (11.07.2006 um 21:20 Uhr)
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.07.2006, 22:20 Nach oben    #12
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Krieg ich da den Code dazu?
Zitat:
Mit dem verkleinern auf 3x3 px hatte ich allerdings noch nicht probiert.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.07.2006, 07:39 Nach oben    #13
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 596
Standard

Zitat:
Krieg ich da den Code dazu?
Ist nicht komplett, aber kann ich amchen.
Siehe PN (die demnächst reinkommt)
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.07.2006, 12:21 Nach oben    #14
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Danke
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.07.2006, 15:40 Nach oben    #15
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

So, ich hab mal eben was hochgeladen:
http://coloranalysys.chrisdiary.de/

Nun zuerst, wird man wohl feststellen, dass ich mit der RGBtoHEX Fukntion noch nicht ganz klar komme (es kommen Farben wie #d2104104 oder #0aa1e raus). Seltsam is halt, dass es mal geht und mal nicht, wobei es bestimmt vom RGBWert abhängt, ich aber keinen Lösungsansatz weiß.

Bestes Beispiel:
http://www.chrisdiary.de/coloranalys...e=DSC03270.JPG

PHP-Code:
<?php
function RGBtoHEX($iR$iG$iB) {
        
$sHex sprintf("%02s"dechex($iR)) . sprintf("%02s"dechex($iG) . sprintf("%02s"dechex($iB)));
        return 
$sHex;
}

// ...
        
for($iY 0$iY <= $iHeight$iY += $iStep) {
                for(
$iX 0$iX <= $iWidth$iX += $iStep) {
                        
$aRGB imageColorsForIndex($rImageimagecolorat($rImage$iX$iY));
                    
$iR $aRGB['red'];
                    
$iG $aRGB['green'];
                    
$iB $aRGB['blue'];

                    
$sHex RGBtoHEXround($iR 10) * 10round($iG 10) * 10round($iB 10) * 10);
                    
#$sHex = RGBtoHEX($iR, $iG, $iB);
?>
Hier gibt es erstmal eine Seltsamkeit: $sHex = RGBtoHEX($iR, $iG, $iB); bringt mir den Fehler "Maximum execution time of 60 seconds exceeded", d.h. er verfängt sich (und zwar auch genau in dieser Zeile, nach Fehlermeldung) deswegen hab ich es auskommentiert - mit der Methode drüber funktioniert es, aber ich seh nicht, warum?

Ansonsten naja, sehts euch mal an - die 1. Methode (die von CIX8 dauert gut ~30 Sekunden bei diesen Bildern ( [mit dem Handy geschossen, 2MP => 1632 x 1224, kann oft der Fall sein weil User soetwas hochladen werden] //edit, musste die Bilder wg dem memory_limit auf meinem Webspace verkleinern.. ). Es gäbe natürlich die Möglichkeit, die Bilder erst zu verkleinern (was ja sowieso passieren muss), und danach Pixel für Pixel durchzugehen.

Meine Hauptfrage ist, welche Methode ihr als besser einschätzt.
Methode 1:
PHP-Code:
<?php
        $oBench 
-> start('Methode 1');
        
// 1. Methode: Pixel für Pixel (im n-er Schritt), hier im Beispiel 5
        
for($iY 0$iY <= $iHeight$iY += $iStep) {
                for(
$iX 0$iX <= $iWidth$iX += $iStep) {
                        
$aRGB imageColorsForIndex($rImageimagecolorat($rImage$iX$iY));
                    
$iR $aRGB['red'];
                    
$iG $aRGB['green'];
                    
$iB $aRGB['blue'];

                    
$sHex RGBtoHEXround($iR 10) * 10round($iG 10) * 10round($iB 10) * 10);
                    
#$sHex = RGBtoHEX($iR, $iG, $iB);
                    
if(in_array($sHex$aColors)) {
                            
$aColors[$sHex] = $aColors[$sHex] + 1;
                    }

                    else {
                            
$aColors[$sHex] = 0;
                    }
                }
        }
        
$oBench -> stop('Methode 1');
?>
oder die zweite:
PHP-Code:
<?php
        $oBench 
-> start('Methode 2');
        
// 2. Methode: Verkleinern des Bildes
        
$iWidthAndHeight 3// wegen x*y Bildkoordinaten kommen hier 9 Farben raus (3²)
        
$aColors2 = array();
        
$rTemp ImageCreateTrueColor($iWidthAndHeight$iWidthAndHeight);
        
ImageCopyResampled($rTemp$rImage0000$iWidthAndHeight$iWidthAndHeight$iWidth$iHeight);


        for(
$iY 0$iY $iWidthAndHeight$iY ++) {
                for(
$iX 0$iX $iWidthAndHeight$iX++) {
                        
$aRGB ImageColorsForIndex($rTempimageColorAt($rTemp$iX$iY));
                        
$iR $aRGB['red'];
                        
$iG $aRGB['green'];
                        
$iB $aRGB['blue'];

                        
$sHex RGBtoHEXround($iR 10) * 10round($iG 10) * 10round($iB 10) * 10);
                    if(
in_array($sHex$aColors2)) {
                            
$aColors2[$sHex] = $aColors2[$sHex] + 1;
                    }

                    else {
                            
$aColors2[$sHex] = 1;
                    }
                }
        }
        
$oBench -> stop('Methode 2');
?>
Wie ihr im Script sehen werdet, ist Methode 2 um vieles schneller, und bringt (solange mein RGB => HEX Problem nicht gelöst ist) auch bessere Ergebnisse.
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (12.07.2006 um 15:57 Uhr)
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.07.2006, 20:10 Nach oben    #16
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 540
Standard

mal ne frage zu methode 1 mit den 5-er schritten:
angenommen du hast eine weißes Bild mit einem schwarzen gitter im 5px abstand...
was passiert dann wohl?

bei der auswahl zwischen 1 und 2 (wobei man vermutlich beide noch optimieren kann) solltest du auch bedenken, dass sie unterschiedliche ergebnisse liefern: methode 1 sucht die am häufigsten vorkommenden farbwerte während methode 2 mischfarben bildet und das ist vermutlich eigentlich nicht das, was du haben möchtest.
dazu auch ein krasses beispiel: ein bild besteht nur aus zwei farbrichtungen: gelb- und blautöne. und was kommt bei methode 2 am ende heraus?
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.07.2006, 20:19 Nach oben    #17
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
dazu auch ein krasses beispiel: ein bild besteht nur aus zwei farbrichtungen: gelb- und blautöne. und was kommt bei methode 2 am ende heraus?
Also hier bekomme ich gelb, und blautöne, und zwar die Mittelwerte von denen. Hab auch erst gedacht es stimmt was du sagst, aber es hat funktioniert.

Zitat:
mal ne frage zu methode 1 mit den 5-er schritten:
angenommen du hast eine weißes Bild mit einem schwarzen gitter im 5px abstand...
was passiert dann wohl?
Joah .. Wird wohl kaum vorkommen, aber theoretisch möglich. Aber im 1px Abstand geht mächtig auf den Server - das dauert dann bis zur 5fachen zeit.

Zitat:
bei der auswahl zwischen 1 und 2 (wobei man vermutlich beide noch optimieren kann)
Kannst du mir optimierungsvorschläge machen?

Zitat:
methode 1 sucht die am häufigsten vorkommenden farbwerte während methode 2 mischfarben bildet und das ist vermutlich eigentlich nicht das, was du haben möchtest.
Mischfarben ist vllt etwas unglücklich, denn naja, irgendwie ist es zwar gemischt, zeigt aber dennoch die häufigsten Farben im Bild (teste es doch mal aus mit meinem Link)
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.07.2006, 21:14 Nach oben    #18
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 596
Standard

Zitat:
angenommen du hast eine weißes Bild mit einem schwarzen gitter
Arg, das ganze soll ja für eine Bildgalerie dienen, keine Grafikgalerie
Angenommen, jemand macht sowas, dann muss er damit leben, das sein Bild einfach (wegen eigener Blödheit) nicht gefunden hat.
Das ganze soll ja für Fotos dienen.

So 100%ig wird man nie Bilder vergleichen können, selbst Google ist das nicht gelungen
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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 sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Compare with latest from repository, Farben zur Anzeige der Änderungen nutzen möglich Ben Eclipse 1 20.03.2007 14:36
Hilfe bei der Zusammenstellung von Farben Ben Plauderecke 25 19.02.2007 13:29
Halbtransparente Farben? ljungi HTML, XML und CSS 7 12.09.2006 15:10
verschiedene Farben in JTextArea veX Allgemeine Java-Programmierung 10 11.02.2005 09:25
java.awt.Image Farben ändern rjung Allgemeine Java-Programmierung 1 22.12.2004 20:58


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr.