sohotcall

PHP Histogram Equalization (and RGB322)

Sep 24th, 2020
1,211
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. function histeq( $im ){
  3.     if ( is_string( $im ) )
  4.         $im = imagecreatefromjpeg( $im );
  5.     $_h = imagesy( $im );
  6.     $_w = imagesx( $im );
  7.     $_f = $_h * $_w / 255;
  8.     for ( $y = 0; $y < $_h ; $y++ ) for ( $x = 0; $x < $_w; $x ++ ){
  9.         $col = imagecolorat( $im, $x, $y );
  10.         $originals[0][ ( $col >> 16 ) & 0xFF ]++;
  11.         $originals[1][ ( $col >> 8 ) & 0xFF ]++;
  12.         $originals[2][ $col & 0xFF ]++;
  13.     }
  14.     foreach ( array( 0, 1, 2 ) as $chn ){
  15.         $ori = $originals[ $chn ];
  16.         $i = 0;
  17.         $sum = array();
  18.         for ( $j = 0; $j < 255; $j++ ){
  19.             $counter = $ori[$j];
  20.             $map = array();
  21.             while ( $counter ){
  22.                 while ( $sum[$i] >= $_f )
  23.                     $i++;
  24.                 $count = min( $counter, $_f - $sum[$i] );
  25.                 $map[ min( $i,255 ) ] += $count / $ori[$j];
  26.                 $sum[$i] += $count;
  27.                 $counter -= $count;
  28.             }
  29.             $cum = 0;
  30.             foreach( $map as $k => $v){
  31.                 $cum += $v;
  32.                 $matrix[$chn][$j][$k] = $cum;
  33.             }
  34.         }
  35.     }
  36.     for ( $y = 0; $y < $_h ; $y++ ) for ( $x = 0; $x < $_w; $x ++ ){
  37.         $col = imagecolorat( $im, $x, $y );
  38.         $kol[0] = ( $col >> 16 ) & 0xFF;
  39.         $kol[1] = ( $col >> 8 ) & 0xFF;
  40.         $kol[2] = $col & 0xFF;
  41.         $rand = rand( 0, 1000000 ) / 1000000;
  42.         foreach ( array( 0, 1, 2 ) as $chn ){
  43.             foreach ( (array) $matrix[$chn][ $kol[$chn] ] as $k => $v ){
  44.                 if ( $rand <= $v ){
  45.                     $kol[$chn] = $k;
  46.                     break;
  47.                 }
  48.             }
  49.         }
  50.         // FF:8bit, FE:7bit, FC:6bit, F8:5bit, F0:4bit, E0:3bit, C0:2bit, 80:1bit
  51.         // ex FFFFFF:RGB888 E0E0C0:RGB332 // 0xF0FCE0;//0xE0F0C0;
  52.         $col = ( ( $kol[0] << 16 ) | ( $kol[1] << 8 ) | $kol[2] ) & 0xE0E0C0;
  53.         imagesetpixel( $im, $x, $y, $col );
  54.     }
  55.    
  56.     ob_start();
  57.     imagejpeg( $im );
  58.     return ob_get_clean();
  59. }
  60.  
  61. header( "Content-Type: image/jpg" );
  62. echo histeq( __DIR__ . "/test.jpg" );
RAW Paste Data