微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于直方图的图像增强算法(HE、CLAHE、Retinex)之(二)

基于直方图的图像增强算法(HE、CLAHE、Retinex)之(二)

时间:02-23 来源:互联网 点击:

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, []);

来看看结果吧~可以对比一下之前的灰度图,不难发现,图像质量已有大幅改善。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top