[PHP] Brightness en Contrast

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Ik ben bezig met een PHP-tool om de histogrammen van PNG-file op te slaan in een MySQL-database en met die gegevens afbeeldingen vergelijken. Dit werkt redelijk.

Nu werk ik met een soort van plugins. Een van die plugins moet de brightness en contrast kunnen gaan regelen.

Nu ben ik opzoek naar een formule waar ik de histogrammen kan berekenen naar de nieuwe waarden. Om ze vervolgend met de histogrammen in de database te vergelijken.
Ik heb informatie hierover gevonden op de volgende site:
http://www.ph.tn.tudelft.nl/Courses/FIP/noframes/fip.html.
Maar sommige delen van de wiskunde die daar wordt beschreven gaat boven mijn pet. 8)7

Is er iemand die mij hierbij wil helpen met het vertalen van deze wiskunde naar PHP? Of iemand die dit probleem al eens eerder heeft opgelost en mij de oplossing kan geven. _/-\o_

Northing.nl


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Zou je iets duidelijker kunnen zijn in wat je precies wil. Ik weet ik niet of ik kan helpen, maar in huidige vorm kan ik (en ik denk ook anderen) weinig maken uit je TS.

Waarvan moet de plugin brightness & contrast aanpassen? Is dat van plaatjes die *ergens* anders vandaan komen of heb je het hier over de histogrammen uit je database?

Welke histogrammen wil je berekenen naar welke nieuwe waarden?

Mijn beste gok is dat je doelt op:
Histogram-based Operations
When one wishes to compare two or more images on a specific basis, such as texture, it is common to first normalize their histograms to a "standard" histogram. This can be especially useful when the images have been acquired under different circumstances
In dat geval zul je ons denk ik enig inzicht moeten geven in hoe je de histogrammen berekent en opslaat.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
T-MOB schreef op zaterdag 05 februari 2005 @ 14:20:
Zou je iets duidelijker kunnen zijn in wat je precies wil. Ik weet ik niet of ik kan helpen, maar in huidige vorm kan ik (en ik denk ook anderen) weinig maken uit je TS.

Waarvan moet de plugin brightness & contrast aanpassen? Is dat van plaatjes die *ergens* anders vandaan komen of heb je het hier over de histogrammen uit je database?

Welke histogrammen wil je berekenen naar welke nieuwe waarden?

Mijn beste gok is dat je doelt op:

[...]


In dat geval zul je ons denk ik enig inzicht moeten geven in hoe je de histogrammen berekent en opslaat.
Alle histogrammen (RGB, luminantie, Alpha) van de afbeeldingen worden opgeslagen in een MySQL-database. Als je een afbeelding toevoegt dan komt ook hiervan de afbeelding in de database. Met de histogram van de nieuwe afbeelding zou je soortgelijke afbeeldingen moeten kunnen vinden, zoals geroteerde of gespiegelde, invert en (ik hoop) ook verschaalde afbeeldingen.
Maar om afbeeldingen met verschillende brightness en contrast moet er een verschuiving in de histogram plaatsvinden.

Bijvoorbeeld:
Contrast stretching (http://www.ph.tn.tudelft....p-istogram.html#Heading76)
a=huidige contrast
b= nieuwe contrast
B= Bit depth
max = maximale contrast in histogram
min = minimale contrast in histogram

b=(2^B-1)*(a-min/max-min)

In het bovenstaande dccument staat wel in hoe dit moet, maar mijn kennis van wiskunde gaat niet zover.
Nu ben ik op zoek naar de formules van brightness en contrast.

Northing.nl


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
hier een autocontrast functie ik een poosje geleden geprogd heb. er zit een histogram bereken-loopje in die je eruit kan vissen. dit doet zeg maar hetzelfde als de photoshop histogram - daar heb ik em destijds op afgestemd...

$img - GD image object
$imgw - breedte plaatje
$imgh - hoogte plaatje

PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
    function autocontrast($img, $imgw, $imgh) {

        $outlo          = 0;            // laagste output-grens
        $outhi          = 255;          // hoogste output-grens
        $skiptreshold   = 0.001;        // sla tint over indien deze heel weinig voorkomt (default = 0.001)

        $hist           = array_fill(0,256,0);  // vul met lege waardes (thanks crisp)

        // ==========================================
        // maak een histogram van het plaatje
        // ==========================================

        $y = $imgh;
        while ($y--) {
            $x = $imgw;
            while ($x--) {
                $pxl    = imagecolorat($img, $x, $y);   // colorindex / rgb-waarde van pixel(x,y)
                $gst    = (($pxl >> 16) & 0xFF) * 0.3
                        + (($pxl >> 8) & 0xFF) * 0.59
                        + ($pxl & 0xFF) * 0.11;         // converteer naar grijswaarde

                $hist[(int)$gst]++;                     // tel aantal van deze grijswaardes
            }
        }

        // ==========================================
        // zoek horizontaal en verticaal bereik uit
        // ==========================================

        $least      = 255;              // minimale en maximale 8bit waarden
        $most       = 0;
        $totpixels  = $imgw * $imgh;    // totaal aantal pixels in plaatje
        $darkest    = 255;              // donkerste grijstint (we werken naar beneden toe)
        $lightest   = 0;                // lichtste grijstint (we werken omhoog)

        $i = 256;
        while ($i--) {
            // --------------------------------------
            // zoek bereik van aantal pixels uit
            // dus de tint die het minst voorkomt
            // en de tint die het meest voorkomt
            // --------------------------------------

            $least  = min($least, $hist[$i]);
            $most   = max($most, $hist[$i]);

            // --------------------------------------
            // zoek bereik van donkerste tot lichtste tint
            // --------------------------------------

            if ($hist[$i] / $totpixels < $skiptreshold) continue;   // indien een tint te weinig voorkomt, skip deze dan
            $darkest    = min($darkest, $i);
            $lightest   = max($lightest, $i);
        }

        $scale = ($most-$least) / 100;

        // ==========================================
        // bereken nieuwe plaatje
        // ==========================================

        $fg     = imagecolorallocate($img, 255, 200, 0);
        $range  = ($outhi - $outlo) / ($lightest - $darkest);   // stretch het contrast op tot de outer limits 0 en 255

        $y = $imgh;
        while ($y--) {
            $x = $imgw;
            while ($x--) {
                $pxl    = imagecolorat($img, $x, $y);   // colorindex / rgb-waarde van pixel(x,y)

                $outr   = ( (($pxl >> 16) & 0xFF) - $darkest) * $range;
                $outg   = ( (($pxl >> 8) & 0xFF) - $darkest) * $range;
                $outb   = ( ($pxl & 0xFF) - $darkest) * $range;

                if ($outr < $outlo) $outr = $outlo;
                if ($outg < $outlo) $outg = $outlo;
                if ($outb < $outlo) $outb = $outlo;

                if ($outr > $outhi) $outr = $outhi;
                if ($outg > $outhi) $outg = $outhi;
                if ($outb > $outhi) $outb = $outhi;

                $col    = imagecolorresolve($img, (int)$outr, (int)$outg, (int)$outb);

                imagesetpixel($img, $x, $y, $col);
            }
        }

        return $img;
    }

Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Bedankt js303,
Jou code en mijn formule doen eigenlijk het zelfde.
Ik zoek meer een formule waarmee je de brightness en/of contrast kunt aanpassen.

Northing.nl


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

Waarom zelf bouwen als bv ImageMagick dat allang ingebouwd heeft :?

Maw, kijk eens hoe open source proggels als IM dat doen en bouw het na (check wel ff de license).

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
chem schreef op dinsdag 08 februari 2005 @ 09:35:
Waarom zelf bouwen als bv ImageMagick dat allang ingebouwd heeft :?

Maw, kijk eens hoe open source proggels als IM dat doen en bouw het na (check wel ff de license).
ik had destijds geen beschikking tot imagemagick.

heb toen wel (oa.) de imagemagick source bekeken en idd gedeeltelijk 'gebruikt' voor hue saturation lightness functies, echter de im-code is ook niet echt leesbaar geschreven waardoor het porten een kwestie wordt van snappen wat er gebeurt en niet simpelweg integraal overnemen. bovendien is het vaak nog best een getweak en gepruts om bestaande code aan de praat te krijgen / te porten / te optimizen. en ik wilde de autocontrast precies zoals die van photoshop.

Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
niet voor het een of ander maar als je al snapt hoe je een histogram maakt, dan lijkt me een brightness / contrast functie toch simpel?? nog niet gemaakt, maar lijkt me:

brightness (per pixel, uitgaande van RGB met 8 bits per component):
R = factor * min(255, max(0, R-component))
G = factor * min(255, max(0, G-component))
B = factor * min(255, max(0, B-component))

waar factor = 0 - 10 (0=max donker / 1=gelijk / 10=max licht)

contrast: het verschil tussen de laagste (0) en hoogste waardes (255) van de RGB-componenten vergroten in een bepaalde curve.... je zou een array van 256 waardes kunnen maken van een curve waarin het maximale contrast-verloop staat, en deze in een bepaalde verhouding mixen met de originele waarde...

Acties:
  • 0 Henk 'm!

Verwijderd

Doet auto-contrast niet gewoon de laagste gedetecteerde kleurwaare uit je histogram op 0 stellen, de hoogste op 1, en daartussen lineair interpoleren?

[ Voor 14% gewijzigd door Verwijderd op 08-02-2005 13:51 ]


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
Verwijderd schreef op dinsdag 08 februari 2005 @ 13:50:
Doet auto-contrast niet gewoon de laagste gedetecteerde kleurwaare uit je histogram op 0 stellen, de hoogste op 1, en daartussen lineair interpoleren?
idd, enige waar je nog rekening mee moet houden is het instellen van een drempelwaarde voor het aantal pixels dat een kleur/helderheid voorkomt:

stel je hebt een heel vaal plaatje, met helderheidswaardes tussen de 100 en 150 terwijl je bereik van 0 - 255 loopt, en er zit 1 pixel in die waarde 255 heeft, dan moet deze pixel verwaarloosd worden omdat anders geen bewerking wordt gedaan en je plaatje vaal blijft...

Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Bedankt voor al jullie reacties. _/-\o_

Het is zo dat ik niet de afbeelding wil veranderen, maar alleen de histogram van de afbeelding (deze zijn ook in de database opgslagen).

Vannacht heb ik een tijd zitten te pikeren. :O Ik wist dat het antwoord voor de brightness hetzelfde zou moeten zijn als 'contrast stretching' (zie eerder in de topic.).
Opeens had ik het EUREKA-moment. Ik snapte hoe 'contrast stretching' werkte. Na een tijdje verder pikeren 8)7 kwam ik op de volgende formules uit.

Wanneer de brightness negatief (bijvoorbeeld "-23") wordt:
a = plaats in histogram, (R+,0), min<a<max
b = nieuwe plaats in histogram, (R+,0), min<a<(max-d)
d = brightness (de verschuiving), (N,0), 0<=d<(max-min)
max = maximale contrast in histogram, (R+), min<max<=255
min = minimale contrast in histogram, (R+,0), 0<=min<max

b = (max-d) * ( ( (a-min) / (max-min) )+ (min / (max-d) ) )

Wanneer de brightness positief (bijvoorbeeld "9") wordt:
a = plaats in histogram, (R+,0), min<a<max
b = nieuwe plaats in histogram, (R+,0), (min+d)<a<max
d = brightness (de verschuiving), (N,0), 0<=d<(max-min)
max = maximale contrast in histogram, (R+), min<max<=255
min = minimale contrast in histogram, (R+,0), 0<=min<max

b = (max) * ( ( (a-min) / (max-min) )+ ( (min+d) / max ) )

Als er vragen hier over zijn dan hoor ik dit graag.
Die gene die het zoeksysteem wil proberen of de broncode ervan wilt hebben moet contact met me op nemen. :)

Northing.nl

Pagina: 1