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 }