Deus Figendi: Sichtbare Pixel zählen

Guten Morgen,
ich bin auf der Suche nach einer Möglichkeit in einer halbtransparenten Grafik die sichtbaren (oder die unsichtbaren) Pixel zu zählen bzw. das Verhältnis ermitteln (welches ich dann ja gegen die Gesamtfläche rechnen kann).

Hintergrund ist folgender: Ich möchte mehrere Grafiken gleich groß darstellen. Diese Grafiken sind von unterschiedlichsten Größen und leider auch Formen.
Nun habe ich einfach die "rechteckige Größe" genommen, also die Fläche die eine Grafik-Datei (oder GIMP-sprech: Ebene) belegt. Nun ist es aber so, dass manche Grafiken rechteckig (ggf. mit abgerundeten Ecken) sind, andere aber recht krude Formen haben. Es ergab sich, dass die Grafiken mit viel Transparenz kleiner wirken als die rechteckigen.
Daher die Idee nur die sichtbaren Pixel zu berücksichtigen. Es mag natürlich sein, dass das auch keine gute Lösung ist, das weiß ich noch nicht ^^ also ihr könnt mir auch gerne Alternativen vorschlagen.
Also nochmal optisch:
 ____
|    |
|____| hätte die Größe 8
 ____
| /\ |
|/__| hätte die Größe 4

Oder
hat die Größe 187.500 (500×375)
hat welche Größe?

--
sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
  1. An dieser Stelle musst Du natürlich davon ausgehen, dass bei einer Transparenz die Hintergrundfarbe nur dann keine Rolle spielt, wenn nicht ein farbiger Rahmen um diesen transparenten Hintergrund liegt - in diesem Fall klappt Deine Auswertung nicht mehr.

    Kurz gesagt, Du musst Dich von außen dem ersten Pixel nähern, dass weniger als 50% Transparenz hat - daran könntest Du Deine gefühlte Bildgröße messen. Doch was machst Du mit Zeilen oder Spalten, in denen nur teilweise Transparente Pixel vorliegen? Dort musst Du eine Möglichkeit zur Gewichtung finden.

    Des weiteren spielt die Hintergrundfarbe eine wesentliche Rolle: wenn statt Transparenz einfach von einem weißen Hintergrund ausgegangen wird, wie wirkt sich das auf das Bild aus? Größere Kontraste (sowohl bei Farbe, Position als auch Größe) wirken auch immer größer als kleinere Kontraste, was eine wunderbare Quelle optischer Täuschungen darstellt. Unser Sehen ist relativ.

    Pauschal würde ich daher sagen, dass Du natürlich versuchen kannst, dem Computer eine primitive Form des Sehens beizubringen, aber großen Erfolg rechne ich Dir dabei nicht aus.

    Gruß, LX

    --
    RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
  2. ich bin auf der Suche nach einer Möglichkeit in einer halbtransparenten Grafik die sichtbaren (oder die unsichtbaren) Pixel zu zählen bzw. das Verhältnis ermitteln (welches ich dann ja gegen die Gesamtfläche rechnen kann).

    Mußt Du das für jede Grafik nur einmal (vorher) machen oder ist die Aufgabe während der Programmlaufzeit zu bewältigen?

    Daher die Idee nur die sichtbaren Pixel zu berücksichtigen. Es mag natürlich sein, dass das auch keine gute Lösung ist, das weiß ich noch nicht ^^ also ihr könnt mir auch gerne Alternativen vorschlagen.

    Ich würde auch bevorzugen nur den umschlossen Bereich zu ermitteln, falls es transparente Pixel als Insel innerhalb von nichttransparenten Bereichen gibt (außer das ist zu aufwendig und die Inseln sind klein). Falls das Ergebnis nicht gut ist, kannst Du dann natürlich auch mit einem Korrekturfaktor arbeiten. D.h. Du läßt die "rechteckige" Größe z.B. zu 40% und die nichttransparente Fläche zu 60% in die Berechnung eingehen. Bei sehr zerfransten und länglichen Formen sollte man eventuell auch die horizontale und vertikale Ausdehnung berücksichtigen, damit die nicht zu groß werden.

    1. Mußt Du das für jede Grafik nur einmal (vorher) machen oder ist die Aufgabe während der Programmlaufzeit zu bewältigen?

      Ich muss das nur einmal machen und auch nicht sehr häufig (voraussichtlich vielleicht 10-20 Mal) also manuell ist schon okay :) Nur wirklich Pixel zählen wollte ich nicht ^^

      Ich würde auch bevorzugen nur den umschlossen Bereich zu ermitteln, falls es transparente Pixel als Insel innerhalb von nichttransparenten Bereichen gibt (außer das ist zu aufwendig und die Inseln sind klein).

      Ja, das hatte ich wohl bedacht und ist auch der Fall. Ich würde dann für die Zählung einfach die "Inseln" mit einer Hintergrundfarbe belegen und somit ignorieren. Denn sie tragen ja nicht wirklich dazu bei, dass die Grafik kleiner aussieht. Gleiches gilt teilweise auch für "Fransen" wenn sie zu kräftig sind. Ich sag mal ein Schnörkel/Spirale oder sowas hat zwar eine ununterbrochene Verbindung nach "außen" aber dennoch würde man sie eher als ein Objekt wahrnehmen.
      Wie gesagt würde ich das aber manuell machen und Verzeihung, ich hätte dazu sagen sollen, dass Handarbeit nicht das Problem ist :)

      @LX:
      Ich habe nur absolute Transparenzen, einen Grenzwert oder so brauche ich eigentlich nicht. Wenn es Halbtransparenzen gibt kann man sie vernachlässigen, da sie bestenfalls Ränder entschärfen.
      Den Kontrast o.ä. würde ich irgnorieren, irgendwann ist der Aufwand nicht mehr verhältnismäßig :)

      --
      sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
      1. Mußt Du das für jede Grafik nur einmal (vorher) machen oder ist die Aufgabe während der Programmlaufzeit zu bewältigen?
        Ich muss das nur einmal machen und auch nicht sehr häufig (voraussichtlich vielleicht 10-20 Mal) also manuell ist schon okay :) Nur wirklich Pixel zählen wollte ich nicht ^^

        Das von Dir schon entdeckte Histogramm wäre auch mein Vorschlag für die händische Variante gewesen. Eine andere Idee habe ich im Moment nicht.

        Ich würde dann für die Zählung einfach die "Inseln" mit einer Hintergrundfarbe belegen und somit ignorieren.

        Meine Idee war zwar entgegengesetzt, fülle die äußeren transparenten Bereiche mit einer Farbe die sonst nicht vorkommt (bei vielen und kleinen Inseln weniger aufwendig), aber so geht es auch.

        1. Meine Idee war zwar entgegengesetzt, fülle die äußeren transparenten Bereiche mit einer Farbe die sonst nicht vorkommt (bei vielen und kleinen Inseln weniger aufwendig), aber so geht es auch.

          Für die Zählung arbeitete ich auf einer Kopie, entsprechend wäre Verschandlung (großzügig auf dem Bild rummalen) nicht das Problem.
          Tatsächlich aber habe ich mit einer Hintergrund-Ebene gearbeitet, die ich dann bemalt habe ^^ Gewohnheit eben.

          --
          sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
  3. Om nah hoo pez nyeetz, Deus Figendi!

    naive Antwort:

    #1# wenn Grafikprogramme in der Lage sind, die Anzahl der verwendeten Farben zu zählen, dann können sie auch die Anzahl der Pixel mit einer bestimmten Farbe bestimmen.

    #2# wenn Grafikprogramme das können, können das auch Programmierer, die Kenntnis über den Aufbau einer Gif-Datei (wenn es denn gif ist) haben.

    Matthias

    --
    1. Hallo

      #1# wenn Grafikprogramme in der Lage sind, die Anzahl der verwendeten Farben zu zählen, dann können sie auch die Anzahl der Pixel mit einer bestimmten Farbe bestimmen.

      Also ich habe beide Funktionen nicht so _richtig_ in GIMP gefunden. Es half auch nichts, wenn ich die Anzahl der Farben festlege anstatt sie zu ermitteln :)
      Es handelte sich zwar um kein GIF aber ich habe es quasi zu einem gemacht und bin mit Hilfe deines Vorschlags auf eine passable (wenngleich nicht optimale) Lösung gekommen.
      Die Pixel einer Farbe zählen scheint GIMP nicht so richtig zu können oder aber ich habe die Funktion nicht gefunden. Aber GIMP kann ein "Histogramm" erstellen. In diesem Histogramm kann man ein gewisses Farbspektrum markieren und dann zeigt GIMP (in furchtbar kleiner Beschriftung) die Anzahl der Pixel wie auch deren Anteil. Darüber hinaus kann man statt des ganzen Farbspektrums auch jeden RGBA-Kanal einzeln anzeigen lassen. Richtig gelesen "Alpha" ist mit dabei :)

      Also jedenfalls geht es "irgendwie" man muss zwar ein bisschen raten was was auf dem Diagramm sein müsste und man muss wie gesagt furchtbar kleine Schrift lesen. Aber ich kann nun den Alpha-Anteil ermitteln :)

      --
      sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
      1. Om nah hoo pez nyeetz, Deus Figendi!

        also die Anzahl der verwendeteten Farben kriegt bei gimp aus der Farbraumanalyse. Da du ja nach transparenten pixeln gefragt hattest, bin ich von gif ausgegangen.
        Bei meiner Harz-IV-Sparvariante von Paintshop Pro (version 5), gibt es einen Menüpunkt Farben zählen. Allerdings hab ich dort auch nicht die Pixelanzahl gefunden.
        Mein Grundgedanke war der, dass man ein Programm schreibt, das die Datei selbst mit einer z.B. For-Schleife erforscht. Die Informationen dazu stecken auf jeden Fall in der Datei.

        Matthias

        --