使用MATLAB中的查找表增加图像对比度

时间:2014-08-07 20:02:04

标签: image matlab image-processing lookup contrast

我正在尝试进行一些图像处理,为此我获得了8位灰度图像。我应该通过生成一个查找表来改变图像的对比度,该查找表可以增加50到205之间像素值的对比度。我使用以下MATLAB代码生成了一个查找表。

a = 2;
x = 0:255;
lut = 255 ./ (1+exp(-a*(x-127)/32));

当我绘制lut时,我得到如下图表:

enter image description here

到目前为止一切顺利,但我如何提高50到205之间像素值的对比度呢?变换映射的最终图应该类似于:

enter image description here

2 个答案:

答案 0 :(得分:5)

根据您的评论判断,您只需要一个线性地图,其中< 50的强度被映射到0,> 205的强度被映射到255,以及一切else是两者之间的线性映射。您可以通过以下方式执行此操作:

slope = 255 / (205 - 50); % // Generate equation of the line - 
                          % // y = mx + b - Solve for m
intercept = -50*slope; %// Solve for b --> b = y - m*x, y = 0, x = 50
LUT = uint8(slope*(0:255) + intercept); %// Generate points
LUT(1:51) = 0; %// Anything < intensity 50 set to 0
LUT(206:end) = 255; %// Anything > intensity 205 set to 255

LUT现在看起来像:

plot(0:255, LUT);
axis tight;
grid;

enter image description here

请注意我在< 50> 205时如何截断强度。 MATLAB在索引1处开始索引,因此我们需要将强度偏移1,以便它们正确映射到从0开始的像素强度。

要最终将此应用于您的图片,您所要做的就是:

out = LUT(img + 1); 

这假设img是您的输入图像。再次注意,当MATLAB在位置1开始索引时,我们必须将输入偏移+1,而强度从0开始。


次要注意事项

您可以使用imadjust轻松完成此操作,这基本上是为您做的。你这样称呼它:

outAdjust = imadjust(in, [low_in; high_in], [low_out; high_out]);

low_inhigh_in表示图片中存在的最小和最大输入强度。请注意,这些是[0,1]之间的标准化。 low_outhigh_out调整图片的强度,以便low_in映射到low_outhigh_in映射到high_out,其他所有内容都是对比在两者之间伸展。对于您的情况,您可以这样做:

outAdjust = imadjust(img, [0; 1], [50/255; 205/255]);

这应该拉伸对比度,使输入强度50映射到输出强度0,输入强度205映射到输出强度255。任何强度< 50> 205都会自动饱和到0255

答案 1 :(得分:2)

您需要拍摄图像中的每个像素,并将其替换为查找表中的相应值。这可以通过一些嵌套的for循环来完成,但它不是最惯用的方法。我建议使用arrayfun替换像素的函数。

new_image = arrayfun(@(pixel) lut(pixel), image);

使用直接在图像上生成lut的代码可能更有效。如果需要考虑性能而您不需要使用查找表,请尝试比较两种方法。

new_image = 255 ./ (1 + exp(-image * (x-127) / 32));

请注意,new_image变量不再是uint8类型。如果您需要再次显示它(例如,使用imshow),则需要通过编写uint8(new_image)将其转换回来。