欢迎DaLao指导

博客名称

你的一句话介绍

灰度直方算法 C++

 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 }

 

posted @ 2014-03-19 12:07  麻辣咸鱼  阅读(508)  评论(0编辑  收藏  举报