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

Graphics 如何增强图像的颜色和对比度,graphics,image-processing,Graphics,Image Processing,我需要处理第一个“原始”图像,以获得类似于第二个“增强”图像的内容。我应用了一些naif计算,新图像具有更高的对比度和更强的颜色,但在颜色较高的区域会出现颜色空洞。我对图像处理一无所知,如果你能建议我可以应用哪些概念和/或算法来获得没有这个问题的结果,那就太好了 将图像转换为颜色空间 将饱和度乘以一定量。如果平台需要,请使用截止值 Mathematica中的示例: satMult = 4; (*saturation multiplier *) imgHSB = ColorConvert[Im

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

将图像转换为颜色空间

将饱和度乘以一定量。如果平台需要,请使用截止值

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 *)

增加饱和值的表格:

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

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

#define clamp(p) (p < 0 ? 0 : (p > 255 ? 255 : p))
定义夹具(p)(p<0?0:(p>255?255:p)) 如果将上述宏添加到处理函数中,它将处理“孔”,但现在这些地方将使用深色

如果你已经准备好做一些更高级的事情,他们有GIMP使用的亮度和对比度公式。如果您选择合适的系数,这些将对您的图像起到非常好的作用。

本文很好地解释了直方图均衡化用于对比度增强

灰度图像的代码:

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;
}
无符号字符*增强对比度(无符号字符*数据、整型宽度、整型高度)
{
int*cdf=(int*)calloc(256,sizeof(int));
对于(int y=0;y
谢谢,事情就是这样。我要去看看那个维基百科网站。