基于直方图的图像增强算法(HE、CLAHE、Retinex)之(二)
plot(tmp_hist)
输出结果下图中的左图所示。
如果我们给ClipLimit赋初值为2.5,则经过语句ClipLimit = max(1,ClipLimit * HSize * WSize/NrBins);计算之后,ClipLimit将变成71.54。然后我们再用上述代码绘制新的直方图,其结果将如上图中的右图所示。显然,图中大于71.54的部分被裁剪掉了,然后又平均分配给整张直方图,所以你会发现整张图都被提升了。这就是我们这里进行直方图裁剪所使用的策略。但是再次强调,matlab中的内置函数adapthisteq()仅仅是将这个参数进行了归一化,这与我们所使用的方法并没有本质上的区别。
继续回到程序实现上的讨论。最后,也是最关键的步骤,我们需要对结果进程插值处理。这也是Zuiderveld设计的算法中最复杂的部分。
yI = 1;
for i = 1:NrY+1
if i == 1
subY = floor(HSize/2);
yU = 1;
yB = 1;
elseif i == NrY+1
subY = floor(HSize/2);
yU = NrY;
yB = NrY;
else
subY = HSize;
yU = i - 1;
yB = i;
end
xI = 1;
for j = 1:NrX+1
if j == 1
subX = floor(WSize/2);
xL = 1;
xR = 1;
elseif j == NrX+1
subX = floor(WSize/2);
xL = NrX;
xR = NrX;
else
subX = WSize;
xL = j - 1;
xR = j;
end
UL = Map(yU,xL,:);
UR = Map(yU,xR,:);
BL = Map(yB,xL,:);
BR = Map(yB,xR,:);
subImage = Bin(yI:yI+subY-1,xI:xI+subX-1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sImage = zeros(size(subImage));
num = subY * subX;
for i = 0:subY - 1
inverseI = subY - i;
for j = 0:subX - 1
inverseJ = subX - j;
val = subImage(i+1,j+1);
sImage(i+1, j+1) = (inverseI*(inverseJ*UL(val) + j*UR(val)) ...
+ i*(inverseJ*BL(val) + j*BR(val)))/num;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
output(yI:yI+subY-1, xI:xI+subX-1) = sImage;
xI = xI + subX;
end
yI = yI + subY;
end
这个地方,作者原文中已经讲得比较清楚了,我感觉我也没有必要狗尾续貂,班门弄斧了。下面截作者原文中的一段描述,足以说明问题。
最后来看看我们处理的效果如何(当然,这里还需要把之前我们填补的部分裁掉)。
output = output(1:h, 1:w);
figure, imshow(output, []);
来看看结果吧~可以对比一下之前的灰度图,不难发现,图像质量已有大幅改善。
- 基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)(02-23)
- 基于SDI接口的实时图像增强显示系统(10-29)
- 基于FPGA的彩色图像增强系统设计(10-26)
- 基于Matlab的图像增强与复原技术在SEM图像中的应(04-15)
- 基于FPGA的图像增强视频处理系统(04-09)
- 基于非抽样Contourlet变换的红外图像增强算法(01-27)