Как улучшить цвета и контрастность изображения - PullRequest
2 голосов
/ 18 сентября 2011

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

Original

Enhanced

Ответы [ 3 ]

3 голосов
/ 19 сентября 2011

Преобразование изображения в цветовое пространство 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 голос
/ 19 сентября 2011

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

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

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

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

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

0 голосов
/ 16 мая 2016

Эта статья википедии хорошо объясняет выравнивание гистограммы для повышения контрастности.

Код для изображений в оттенках серого:

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;
}
...