直方图规定化
原理:
在实际应用中,希望能够有目的地增强某个灰度区间的图像, 即能够人为地修正直方图的形状, 使之与期望的形状相匹配,这就是直方图规定化的基本思想。换句话说,希望可以人为地改变直方图形状,使之成为某个特定的形状,直方图规定化就是针对上述要求提出来的一种增强技术,它可以按照预先设定的某个形状来调整图像的直方图。直方图规定化是在运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状,从而弥补了直方图均衡不具备交互作用的特性。
例如:Pr (r)为原图像的灰度密度函数, Pz (z)为希望得到的增强图像的灰度密度函数,二者的直方图如下:
直方图规定化增强处理的步骤如下:
1,其增强原理是先对原始的直方图均衡化:S = T(r)
2,同时对规定的直方图均衡化:v = G(z)
3,由于都是均衡化,故令 S = v,则:z = G-1(v) = G-1[T(r)] 。
组映射:
存在一维离散整数函数I(a),(a=0,1,2……N-1),而且满足0≤I(0) ≤I(1) ≤……≤I(a) ≤……≤I(N-1) ≤M-1。寻找能使 |∑ps(si)-∑pu(uj)| 达到最小的I(a),其中ps(si)的求和区间为[0,I(a)],pu(uj)的求和区间仍为[0,a]。a=0时,将介于0和I(0)之间的ps(si)都映射到pu(u0)中;1≤a≤N-1时,将介于I(a-1)+1和I(a)之间的ps(si)都映射到pu(uj)中去。
代码:
根据希望达到的直方图数据,对当前图像直方图转换,得到转换的直方图数据。
- void HistogramSpecification(int* src, int* dst, int* histMap)
- {
- int x = 0, y = 0, i = 0;
- int minX = 0;
- int minValue = 0;
- int srcMin[256][256];
- short lastStartY = 0, lastEndY = 0, startY = 0, endY = 0;
- //计算原始图像到目标图像累积直方图各灰度级的差的绝对值
- for (y = 0; y < 256; y++)
- {
- for (x = 0; x < 256; x++)
- {
- srcMin[x][y] = abs(src[y] - dst[x]);
- }
- }
- //GML映射
- for (x = 0; x < 256; x++)
- {
- minValue = srcMin[x][0];
- for (y = 0; y < 256; y++)
- {
- if (minValue > srcMin[x][y])
- {
- endY = y;
- minValue = srcMin[x][y];
- }
- }
- if (startY != lastStartY || endY != lastEndY)
- {
- for (i = startY; i <= endY; i++)
- {
- histMap[i] = x;//建立映射关系
- }
- lastStartY = startY;
- lastEndY = endY;
- startY = lastEndY + 1;
- }
- }
- }