[PHP5] "Schwarzanteil" eines Bilds berechnen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [PHP5] "Schwarzanteil" eines Bilds berechnen

    Hallo zusammen,

    ich habe nach längerer Aufbauphase eine Plattform programmiert, die Fotos von Veranstaltungen der breiten Masse zur Verfügung stellt. Nun kommt es oftmals vor, dass User zu faul sind, Bilder die zu 90% aus schwarzem Hintergrund bestehen, auszusortieren und nicht hochzuladen. (z.B. Foto in der Nacht und nur ein Gesicht ist beleuchted, sonst total Schwarz)

    Ich habe überlegt, ob es mit PHP möglich wäre ein Bild dahingehend zu untersuchen, ob es mit sinnvollerem Inhalt befüllt ist, als mit Schwarz. Sollte der "Schwarz-Anteil" zu hoch sein, wird das Bild verworfen.
    Leider habe ich weder Kenntnisse in der Farbenlehre noch die geringste Ahnung wie man soetwas realisieren könnte - und das allerwichtigste: ich weiß nicht, ob solch eine Untersuchung nicht zu performancelastig wäre. Denn ich verarbeite mit einem Aufruf gern auch mal mehrere hundert MB Bilddaten und bin jedes Mal von neuem erstaunt, dass PHP noch damit umgehen kann

    Hat jemand eine Idee zu solch einer Problemstellung?

    Grüße
    DuRoX

  • #2
    Wen du keine Ahnung von Farbe hast und dir angst um die Performance machst, lass es einfach bleiben.
    "Nicht jeder Mensch kann und soll Programmieren[...]".

    Kommentar


    • #3
      PHP-Code:
      function computeAvgRGB(){
        
      $res imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT'].
      '/path/to/pics/pic.jpg');
        
      $width imagesx($res);
        
      $height imagesy($res);
        
      $r 0;
        
      $g 0;
        
      $b 0;
        for(
      $y=1;$y<$height;$y++){
          for(
      $w=1;$w<$width;$w++){
            
      $rgb imagecolorat($res$w$y);
            
      $r += ($rgb >> 16) & 0xFF;
            
      $g += ($rgb >> 8) & 0xFF;
            
      $b += $rgb 0xFF;
          }
        }
        
      $r round($r/($width*$height));
        
      $g round($g/($width*$height));
        
      $b round($b/($width*$height));
        return array(
      $r,$g,$b);

      So erhälst du ein Array mit den durchschnittlichen Rot, Grün und Blau Werten. Wenn diese Werte über deinem Schwellenwert liegen, knickst du das Bild

      Gruss
      tobi
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        hmm ich ich denke mal wenn er jetzt schon probleme mit der Performance hat dann wird die funktion von jahlives glaube umhauen..
        denn du machst ja ein neues img von dem hochgeladenen jpeg.

        Zugegeben ich wüsste jetzt auch keine bessere möglichkeit.

        Aber eventuell schaust du dir mal die Funktionen imagecolorallocate()
        mal genauer an.
        könnte dir eventuell helfen.

        ansonsten :
        @ xkl1986 : also wie ich diese kommentare zu kneifen versuche.
        Probier mal das nächste mal etwas gescheites von deiner Tastatur zu übergeben.

        Kommentar


        • #5
          imagecolorallocate legt eine Farbe fest, glaube nicht, dass ihm das was bringt. So oder so muss das Bild geladen werden und sowas zu analysieren ist nunmal rechenintensiv.
          Ich geb mal zu beachten, dass pro Megapixel/Bild 1Mio Schleifendurchgänge gemacht werden. Bei >100MB kann das schon heftig werden, aber am besten testest du den Code einfach mal auf seine Zeit und schaust dann, wie viel da drin ist...

          Kommentar


          • #6
            Hallo,
            vielen Dank für eure Antworten.

            @jahlives:
            danke für die Funktion. Ich habe diese auf meiner lokalen Testumgebung implementiert, da ich zum Resizen bereits schon ein neues Bild erstelle. Dann habe ich mir eine kleine Benchmarkklasse geschrieben und leider festgestellt, dass die Ausführungszeit auf meinem alten Rechner (XP2100+) bei einem 1600x1200px EOS Bild durchschnittlich bei ca. 5-10 Sekunden (100% CPU Load) liegt. Beim Abarbeiten von ca. 1000 Bildern (wie es jetzt der Fall ist), wären das nochmal 2,7 Stunden nur für das Aussortieren der schwarzen Bilder.
            Echt schade. Ich hatte mir erhofft, dass PHP hier eine performance optimierte Funktion für solch eine Aufgabe anbietet.

            Falls es jemanden interessiert, hier die Ausgabe von jahlives Funktion bei einem potentiell auszusortierenden Bild:

            PHP-Code:
            Array ( [0] => 22 [1] => 17 [2] => 14 )
            Ausführungszeit7.652 Sekunden 
            Viele Grüße
            DuRoX

            Kommentar


            • #7
              Du kannst die Zeit wesentlich drücken wenn du bestimmte Pixel überspringst oder das Bild z.B. auf 100x100 Pixel verkleinerst. Das sollte für eine solche Analyse normalerweise ausreichen.
              Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

              Kommentar


              • #8
                Hallo tontechniker,
                danke für den Tip, jetzt hat sich die Ausführungszeit bei 100x100px auf annehmbare 0,12 Sekunden verkürzt.
                Bleibt jetzt nur noch die Frage nach der richtigen Festlegung des Schwellenwerts und was ich genau mit den drei Array Werten machen muss. Mir ist aufgefallen, dass bei dieser Verkleinerung lediglich der dritte Wert nicht Null ist. Blau ist aber nicht schwarz?!
                Bin etwas ratlos.

                Grüße
                DuRoX

                Kommentar


                • #9
                  Hmm, ich würde sagen: Einfach ausprobieren!
                  Eine perfekte null wirst Du nie bekommen. Es geht um Schwellenwerte, die Du am allerbesten mit einem manuellen Vergleich der maschinellen Analyse rausfindest.

                  Kommentar


                  • #10
                    Alles klar, kannst du mir den "manuellen Vergleich der machinellen Analyse" mal etwas pragmatisch näher bringen? Google lieferte leider nur Müll..

                    Kommentar


                    • #11
                      Na, Bilder + Durchschnitts-RGB nebeneinander anzeigen lassen und beurteilen, ob die Bilder schwarz sind oder nicht! Dann zeigen sich Gesetzmäßigkeiten.

                      Kommentar


                      • #12
                        ich weiß ja net wie viele Bilder da so pro tag hochgeladen werden, aber so etwas in einer "Lahmen" Interpretersprache zu machenist schon ein graus
                        "Nicht jeder Mensch kann und soll Programmieren[...]".

                        Kommentar


                        • #13
                          Du suchst dir ein paar Bilder, welche du aussortieren möchtest und lässt dir den berechneten Schwarzwert dieser ausgeben.
                          Dann suchst du dir noch ein paar recht dunkle Bilder, welche du nicht aussortieren würdest. Aus diesen Werten musst du einen guten Mittelwert wählen, so dass die schwarzen Bilder weggeworfen werden, die dunklen Bilder aber noch über dem Wert liegen!

                          Kommentar


                          • #14
                            Eventuell könnte dir auch ImageMagick bei deinem Problem helfen. Über identify müsste das ganze auch zu lösen sein.

                            Eventuell bringt dir das auch von der Performance her was. Kannst du ja mal ausprobieren.

                            ich weiß ja net wie viele Bilder da so pro tag hochgeladen werden,
                            ich weiß ja net ob du lesen kannst - aber das wurde bereits desöfteren hier geschrieben...
                            Simploo CMS - das einfache Webseiten-Bearbeitungsprogramm

                            Kommentar

                            Lädt...
                            X