我正在尝试进行一些图像处理,为此我获得了 8 位灰度图像。我应该通过生成一个查找表来改变图像的对比度,该查找表增加 50 到 205 之间像素值的对比度。我使用以下 MATLAB 代码生成了一个查找表。
a = 2;
x = 0:255;
lut = 255 ./ (1+exp(-a*(x-127)/32));
当我绘制 lut
时,我得到如下图:
目前一切顺利,但我该如何提高 50 到 205 之间像素值的对比度?变换映射的最终图应该是这样的:
最佳答案
从您的评论来看,您只需要一个线性 map ,其中强度为 < 50
映射到 0,强度为 > 205
映射到 255,其他所有内容都是两者之间的线性映射。您可以通过以下方式简单地执行此操作:
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;
请注意当强度为 < 50
时我是如何截断强度的和 > 205
. MATLAB 从索引 1 开始索引,因此我们需要将强度偏移 1,以便它们正确映射到从 0 开始的像素强度。
要最终将其应用到您的图像中,您所要做的就是:
out = LUT(img + 1);
这是假设 img
是你的输入图像。再次注意,我们必须将输入偏移 +1
。因为 MATLAB 从位置 1 开始索引,而强度从 0 开始。
小注
您可以使用 imadjust
轻松完成此操作,这基本上是在幕后为您完成的。你这样调用它:
outAdjust = imadjust(in, [low_in; high_in], [low_out; high_out]);
low_in
和 high_in
表示图像中存在的最小和最大输入强度。请注意,这些在 [0,1]
之间进行了标准化。 . low_out
和 high_out
调整图像的强度,使 low_in
映射到 low_out
, high_in
映射到 high_out
,其他一切都是在两者之间延伸的对比。对于你的情况,你会这样做:
outAdjust = imadjust(img, [0; 1], [50/255; 205/255]);
这应该拉伸(stretch)对比度使得输入强度 50
映射到输出强度 0
和输入强度 205
映射到输出强度 255
.任何强度 < 50
和 > 205
自动饱和到 0
和 255
分别。
关于image - 使用 MATLAB 中的查找表增加图像对比度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191218/