如何增强图像的颜色和对比度

时间:2011-09-18 11:28:57

标签: graphics image-processing

我需要处理第一个“原始”图像以获得类似于第二个“增强”图像的内容。我应用了一些naif计算,新图像具有更多对比度和更强烈的颜色,但在较高颜色区域中出现颜色孔。我不知道图像处理,如果你可以建议我可以应用哪些概念和/或算法来获得没有这个问题的结果,那将会很棒。

Original

Enhanced

3 个答案:

答案 0 :(得分: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 :(得分:1)

您在处理过的图片中看到的“洞”是原始图片的较暗区域,使用变暗算法会变为负值。我怀疑这些超出范围的值然后以正数写入新图像,因此它们最终位于亮度范围的较高部分。例如,假设像素值为10,并且您从所有像素中减去12以使它们稍微变暗。该像素将下溢并变为-2。当你把它写回文件时,-2以十六进制表示为0xfe,如果你把它作为无符号数字,则为254。

您应该使用一种算法来保持像素值在有效范围内,或者至少应该将值“钳制”到有效范围内。定义为C宏的典型钳位函数为:

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

如果将上面的宏添加到处理功能中,它将处理“孔”,但现在你将在那些地方使用深色。

如果你准备好更高级的东西,here on Wikipedia它们具有GIMP使用的亮度和对比度公式。如果您选择合适的系数,这些将对您的图像做得很好。

答案 2 :(得分: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;
}