2011-09-18 2 views
2

Мне нужно обработать первое «оригинальное» изображение, чтобы получить что-то похожее на второй «улучшенный». Я применил некоторые вычисления naif, и новое изображение имеет более контрастные и более сильные цвета, но в более высоких цветовых областях появляется цветное отверстие. Я понятия не имею о обработке изображений, было бы здорово, если бы вы предложили мне, какие концепции и/или алгоритмы я мог бы применить, чтобы получить результат без этой проблемы.Как улучшить цвет и контраст изображения

Original

Enhanced

ответ

3

Преобразование изображения в HSB (Hue, Saturation, Brightness) цветового пространства.

Умножьте насыщенность на некоторую величину. Используйте значение отсечки, если это требует платформа.

Примера в Mathematica:

satMult = 4; (*saturation multiplier *) 
imgHSB = ColorConvert[Import["http://i.imgur.com/8XkxR.jpg"], "HSB"]; 
cs  = ColorSeparate[imgHSB];     (* separate in H, S and B*) 
newSat = Image[ImageData[cs[[2]]] * satMult]; (* cs[[2]] is the saturation*) 
ColorCombine[{cs[[1]], newSat, cs[[3]]}, "HSB"]] (* rebuild the image *) 

enter image description here

Таблица увеличение значения насыщенности:

enter image description here

1

"дыры", которые вы видите в обработанных изображениях являются темнее области исходного изображения, которые пошли на отрицательные значения с помощью вашего алгоритма затемнения. Я подозреваю, что эти значения вне диапазона записываются на новое изображение в виде положительных чисел, поэтому они попадают в верхнюю часть шкалы яркости. Например, предположим, что значение пикселя равно 10, и вы вычитаете 12 из всех пикселей, чтобы немного их затемнить. Этот пиксель будет переполняться и станет -2. Когда вы пишете его обратно в файл, -2 получает представление как 0xfe в шестнадцатеричном формате, а это 254, если вы принимаете его как неподписанное число.

Вы должны использовать алгоритм, который поддерживает значения пикселей в допустимом диапазоне или, по крайней мере, вы должны «закрепить» значения в допустимом диапазоне. Типичная функция зажима определяется как C макрос будет:

#define clamp(p) (p < 0 ? 0 : (p > 255 ? 255 : p)) 

Если добавить выше макрос к вашей функции обработки она будет заботиться о «дырах», но вместо этого теперь вы будете иметь темные цвета в тех местах, ,

Если вы готовы к чему-то более продвинутому, here on Wikipedia, у них есть формулы яркости и контраста, которые используются GIMP. Они будут делать довольно хорошую работу с вашим изображением, если вы выберете правильные коэффициенты.

+0

Спасибо, that's точно как там происходит. Я буду смотреть на этот сайт в Википедии. – Daniel

0

Настоящая статья wikipedia хорошо объясняет выравнивание гистограммы для усиления контраста.

Код для черно-белых изображений:

unsigned char* EnhanceContrast(unsigned char* data, int width, int height) 
{ 
    int* cdf = (int*) calloc(256, sizeof(int)); 
    for(int y = 0; y < height; y++) { 
     for(int x = 0; x < width; x++) { 
      int val = data[width*y + x]; 
      cdf[val]++; 
     } 
    } 

    int cdf_min = cdf[0]; 
    for(int i = 1; i < 256; i++) { 
     cdf[i] += cdf[i-1]; 
     if(cdf[i] < cdf_min) { 
      cdf_min = cdf[i]; 
     } 
    } 

    unsigned char* enhanced_data = (unsigned char*) malloc(width*height); 
    for(int y = 0; y < height; y++) { 
     for(int x = 0; x < width; x++) { 
      enhanced_data[width*y + x] = (int) round(cdf[data[width*y + x]] - cdf_min)*255.0/(width*height-cdf_min); 
     } 
    } 

    free(cdf); 
    return enhanced_data; 
} 
Смежные вопросы