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