Я использую этот код (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
вместо этого использует строки сканирования должно быть в несколько тысяч раз быстрее).
. Еще один недостаток вашего подхода - что вы просто бинаризуете изображение, теряя все визуализированное сглаживание текста ...