<p>让我们定义一下你使用的曝光术语。你可以曝光明亮和黑暗的场景说1秒,并有完全不同的图像。或者,您可能希望图像具有相似的对比度,但这并不意味着必须进行相同的曝光。</p>
<p>既然您提到了直方图均衡化,那么您最终可能会将两个图像的直方图等同起来,使它们看起来具有相同的对比度。直方图均衡化将使每个图像直方图看起来平坦,因此所有强度都是相同的可能性(因此最佳分布,以最大化对比度-并不总是一个令人赏心悦目的效果)。您可能希望为每个图像分别创建自己的非平面直方图配置文件,并对其进行修改,直到图像看起来像您希望的那样。</p>
<p>下面是一个伪代码:
一。计算每张图像的直方图:H[i]
2。将直方图求和为累积直方图:C[i]=H[i]+C[i-1]分别用于每个图像;
三。规范化每个:C[i]/=和(C(i))
四。在传统的直方图均衡化中,您重新映射像素强度,以便它们同样可能:i2=255*C[i1];在您的情况下,您只希望它们遵循您自己的直方图配置文件(这样您就可以有一个滑块来调整每个图像强度分布,然后直观地比较结果);例如,尝试类似这样的重新映射:i2=i1*k+255*C[i1]*(1-k),其中滑块将k的值从0.0更改为1.0。当k=1时,得到原始图像;当k=0时,得到完整的直方图均衡化。下面是一个直方图均衡化函数,我用它来绘制Kinect深度的颜色映射,它有10000到255个灰度级别。您必须根据您的情况修改和调整功能。</p>
<pre><code>// histogram equalization
float histEq[10000];
void histEqualize(unsigned short* src, unsigned short* dst, int sz) {
if (sz==0)
return;
memset(histEq, 0, DEPTH_LEVELS*sizeof(float));
// 1. depth histogram
for (int i=0; i<sz; ++i) {
unsigned short val = src[i];
if (val!=0 && val < DEPTH_LEVELS)
histEq[val]++;
}
// 2. cumulative histogram
for (int i=1; i<DEPTH_LEVELS; ++i)
histEq[i] += histEq[i-1];
long max_cumul = histEq[DEPTH_LEVELS-1];
if (max_cumul==0)
return;
// 3. mapping function
for (int i=1; i<DEPTH_LEVELS; ++i)
histEq[i] = (255*histEq[i])/max_cumul;
// remap src
for (int i=0; i<sz; ++i) {
unsigned short z = src[i];
if (z>0)
dst[i] = (unsigned char)(255-histEq[src[i]]+0.5f);
else
dst[i] = 0;
}
} // histEqualization()
</code></pre>