C ++ < алгоритм > реализация объяснила

Я использую этот код (C ++):

void picture::enhance_range()
    {
    int i,x,y,a0[4],min[4],max,n,c0,c1,q,c;
    if (xs<1) return;
    if (ys<1) return;

    n=0;    // dimensions to interpolate
    if (pf==_pf_s   ) { n=1; c0=0; c1=127*3; }
    if (pf==_pf_u   ) { n=1; c0=0; c1=255*3; }
    if (pf==_pf_ss  ) { n=2; c0=0; c1=32767; }
    if (pf==_pf_uu  ) { n=2; c0=0; c1=65535; }
    if (pf==_pf_rgba) { n=4; c0=0; c1=  255; } // this is your image pixel format so ignore the other pf statements

    // find min,max intensities
    dec_color(a0,p[0][0],pf);
    for (i=0;ic) min[i]=c;
            if (maxc1) a0[i]=c1; // clamp if needed
        enc_color(a0,p[y][x],pf); // this just pack a0[4]={r,g,b,a} to pixel color p[][]
        }
    }

где:

  • pf - это текущий формат пикселя в вашем случае pf=_pf_rgba, который является просто перечислением константа
  • xs,ys - разрешение изображения
  • p[y][x] - прямой доступ к пикселю изображения
  • enc_color,dec_color просто упаковывать / распаковывать цветовые компоненты для нужного пикселя format

Это результат:

Основная идея - найти минимальное и максимальное значение цвета, Затем увеличьте этот динамический диапазон до максимума. Например, (в оттенках серого) ваше изображение имеет:

min=181;
max=254;

Итак, если вы берете каждый пиксель и масштабируетесь до макс <0,255>, вам нужно сделать что-то вроде:

color=(color-min)*255/(max-min);

для каждого пикселя изображения, и это все.

[Примечания]

Как заметил @RosaGronchi, ваш текущий подход медленный из-за использования getpixel,setpixel вместо этого использует строки сканирования должно быть в несколько тысяч раз быстрее).

. Еще один недостаток вашего подхода - что вы просто бинаризуете изображение, теряя все визуализированное сглаживание текста ...

30
задан Christian Ammer 16 July 2013 в 07:54
поделиться