1 #include <string>
2 #include "20140318计算类的面积.cpp"
3
4 //////////////////////////////////////////////////////////////////////////
5 // 函数名称: histeq()
6 // 传入参数:
7 // BYTE*dstData 传入灰度图像内存空间的指针
8 // double *srcArray 模版的直方图累积,并进行归一化,大小为256
9 // int m_Width 匹配内存空间的宽度
10 // int m_Height 匹配内存空间的高度
11 // int m_pitch 匹配内存空间的每行所在内存大小
12 ////////////////////////////////////////////////////////////////////////
13
14 void histeq(int **dstData, double *srcArray,int m_Width,int m_Height,int m_pitch)
15 {
16 //void *memset(void *s,int c,size_t n)将已开辟内存空间 s 的首 n 个字节的值设为值 c
17 m_pitch=sizeof(data[0][0])*nXSize;
18 double dstHist[256];
19 memset(dstHist,0,256 * sizeof(double));
20 double dstArray[256];
21 memset(dstArray,0,256 * sizeof(double));
22 int i=0,j=0;
23 //统计直方图
24 for (i = 0;i < m_Height;i++)
25 {
26 for (j = 0;j < m_Width;j++)
27 {
28 dstHist[(int)dstData[i * m_pitch + j]]++;
29 }
30 }
31 //计算直方图累积
32 double m_Bytes = m_Width * m_Height;//m_Bytes初始化为像素总个数
33 dstArray[0] = dstHist[0];//第一个初始化为dstHist[0]=0
34 for (i = 1;i < 256;i++)
35 {
36 dstArray[i] = dstArray[i - 1] + dstHist[i];
37 }
38 //直方图累积归一化
39 for (i = 0;i < 256;i++)
40 {
41 dstArray[i] /= m_Bytes;
42 }
43 //直方图匹配
44 double m_diffA,m_diffB;
45 int k = 0;
46 float mapPixel[256];//每个颜色的value
47 memset(mapPixel,0,256 * sizeof(float));
48
49
50 for (i = 0;i < 256;i++)
51 {
52 m_diffB = 1;
53 for (j = k; j < 256;j++)
54 {
55 m_diffA = abs(dstArray[i] - srcArray[j]);
56 if (m_diffA - m_diffB < 1.0E-5)
57 {
58 m_diffB = m_diffA;
59 k = j;
60 }
61 else
62 {
63 k = j - 1;
64 break;
65 }
66 }
67 if (k == 255)
68 {
69 for (int l = i;l < 256;l++)
70 {
71 mapPixel[l] = (float) k;
72 }
73 break;
74 }
75 mapPixel[i] = (float) k;
76 }
77 //目标图像查找索引表
78 for (i = 0;i < m_Height;i++)
79 {
80 for (j = 0;j < m_Width;j++)
81 {
82 dstData[i * m_pitch + j] = mapPixel[(int)dstData[i * m_pitch + j]];
83 }
84 }
85 }