?? huidubianhuandib.cpp
字號:
}
gailu[i] = temp[i];
}
// 計算規定累計直方圖
for (i = 0; i < bNum; i++)
{
if (i == 0)
{
temp[0] = fpPu[0];
}
else
{
temp[i] = temp[i-1] + fpPu[i];
}
fpPu[i] = temp[i];
}
// 確定映射對應關系
for (i = 0; i < 256; i++)
{
// 最接近的規定直方圖灰度級
int m_r = 0;
// 最小差值
float min_value_r = 1.0f;
// 對規定直方圖各灰度進行枚舉
for (j = 0; j < bNum; j++)
{
// 當前差值
float now_value = 0.0f;
// 計算差值
if (gailu[i] - fpPu[j] >= 0.0f)
now_value = gailu[i] - fpPu[j];
else
now_value = fpPu[j] - gailu[i];
// 尋找最接近的規定直方圖灰度級
if (now_value < min_value_r)
{
// 最接近的灰度級
m_r = j;
// 暫存最小差值
min_value_r = now_value;
}
}
// 建立灰度映射表
midu[i] = npNu[m_r];
}
// 對各像素進行處理
for (j = 0; j < height; j ++)
{
for (i = 0; i < wide; i ++)
{
// 對像素進行單映射規則的直方圖規定化映射處理
unsigned char temp = *((unsigned char *)p_data + wide * j + i);
*((unsigned char *)p_data + wide * j + i) = midu[temp];
}
}
}
else //24位彩色
{
// 對灰度密度分布進行統計
Midufenbu(midu,midu2,midu3);
// 對灰度分布概率進行統計
ZhiFangTu(gailu,gailu2,gailu3);
// 計算原始累計直方圖
for (i = 0; i < 256; i++)
{
if (i == 0)
{
temp[0] = gailu[0];
temp2[0] = gailu2[0];
temp3[0] = gailu3[0];
}
else
{
temp[i] = temp[i-1] + gailu[i];
temp2[i] = temp2[i-1] + gailu2[i];
temp3[i] = temp3[i-1] + gailu3[i];
}
gailu[i] = temp[i];
gailu2[i] = temp2[i];
gailu3[i] = temp3[i];
}
// 計算規定累計直方圖
for (i = 0; i < bNum; i++)
{
if (i == 0)
{
temp[0] = fpPu[0];
}
else
{
temp[i] = temp[i-1] + fpPu[i];
}
fpPu[i] = temp[i];
}
// 確定映射對應關系
for (i = 0; i < 256; i++)
{
// 最接近的規定直方圖灰度級
int m_r = 0;
int m_g = 0;
int m_b = 0;
// 最小差值
float min_value_r = 1.0f;
float min_value_g = 1.0f;
float min_value_b = 1.0f;
// 對規定直方圖各灰度進行枚舉
for (j = 0; j < bNum; j++)
{
// 當前差值
float now_value = 0.0f;
// 計算差值
if (gailu[i] - fpPu[j] >= 0.0f)
now_value = gailu[i] - fpPu[j];
else
now_value = fpPu[j] - gailu[i];
// 尋找最接近的規定直方圖灰度級
if (now_value < min_value_r)
{
// 最接近的灰度級
m_r = j;
// 暫存最小差值
min_value_r = now_value;
}
// 計算差值
if (gailu2[i] - fpPu[j] >= 0.0f)
now_value = gailu2[i] - fpPu[j];
else
now_value = fpPu[j] - gailu2[i];
// 尋找最接近的規定直方圖灰度級
if (now_value < min_value_g)
{
// 最接近的灰度級
m_g = j;
// 暫存最小差值
min_value_g = now_value;
}
// 計算差值
if (gailu3[i] - fpPu[j] >= 0.0f)
now_value = gailu3[i] - fpPu[j];
else
now_value = fpPu[j] - gailu3[i];
// 尋找最接近的規定直方圖灰度級
if (now_value < min_value_b)
{
// 最接近的灰度級
m_b = j;
// 暫存最小差值
min_value_b = now_value;
}
}
// 建立灰度映射表
midu[i] = npNu[m_r];
midu2[i] = npNu[m_g];
midu3[i] = npNu[m_b];
}
// 對各像素進行處理
for (j = 0; j < height; j ++)
{
for (i = 0; i < wide; i ++)
{
// 對像素進行單映射規則的直方圖規定化映射處理
unsigned char temp = *((unsigned char *)p_data + wide * j*3 + i*3);
*((unsigned char *)p_data + wide * j*3 + i*3) = midu[temp];
unsigned char temp2 = *((unsigned char *)p_data + wide * j*3 + i*3+1);
*((unsigned char *)p_data + wide * j*3 + i*3+1) = midu[temp2];
unsigned char temp3 = *((unsigned char *)p_data + wide * j*3 + i*3+2);
*((unsigned char *)p_data + wide * j*3 + i*3+2) = midu[temp3];
}
}
}
}
///***************************************************************/
/*函數名稱:Midufenbu()
/*函數類型:void
/*功能:對圖像進行密度分布變換。
/***************************************************************/
void HuiDuBianHuanDib::Midufenbu(int *nNs_R)
{
// 循環變量
LONG i;
LONG j;
LONG wide;
LONG height;
//變量初始化
memset(nNs_R,0,sizeof(int) * 256);
// 指向DIB象素指針
LPBYTE p_data;
// 找到DIB圖像象素起始位置
p_data = this->GetData();
wide=this->GetWidth ();
// DIB的高度
height = GetHeight();
// 對各像素進行灰度轉換
for (j = 0; j < height; j ++)
{
for (i = 0; i <wide; i ++)
{
// 對各像素進行灰度統計
unsigned char temp = *((unsigned char *)p_data + wide * j + i);
nNs_R[temp]++;
}
}
}
///***************************************************************/
/*函數名稱:Shuipingtouying()
/*函數類型:void
/*功能:對圖像進行水平投影。
/***************************************************************/
void HuiDuBianHuanDib::Shuipingtouying()
{
LPBYTE p_data, p_datatemp; //原圖數據區指針
int wide,height; //原圖長、寬
int i,j; //循環變量
int lBlackNum ;
p_datatemp=this->GetData();
p_data=p_datatemp;
if(m_pBitmapInfoHeader->biBitCount<9)
wide=this->GetWidth ();
else
wide=this->GetDibWidthBytes();
height=this->GetHeight ();
//對圖像進行二值化
for(j=0;j<height;j++)
{
for(i=0;i<wide;i++)
{
if (*p_data>128)
*p_data=255;
else *p_data=0;
p_data++;
}
}
p_data=p_datatemp;
LPBYTE temp=new BYTE[wide*height]; //新圖像緩沖區
memset( temp,255,wide*height); //設定新圖像初值為255
for(j=0;j<height;j++)
{
lBlackNum=0;
for(i=0;i<wide;i++)
{
if(p_data[wide*j+i]==0)
lBlackNum++;
}
for(i=0;i<lBlackNum;i++)
temp[wide*j+i]=0;
}
memcpy(p_data, temp,wide*height);
delete temp;
}
///***************************************************************/
/*函數名稱:Chuizhitouying()
/*函數類型:void
/*功能:對圖像進行垂直投影。
/***************************************************************/
void HuiDuBianHuanDib::Chuizhitouying()
{
LPBYTE p_data, p_datatemp; //原圖數據區指針
int wide,height; //原圖長、寬
int i,j; //循環變量
long int lBlackNum; //圖像中每行內黑點的個數
p_datatemp=this->GetData();
p_data=p_datatemp;
if(m_pBitmapInfoHeader->biBitCount<9)
wide=this->GetWidth ();
else
wide=this->GetDibWidthBytes();
height=this->GetHeight ();
//對圖像進行二值化
for(j=0;j<height;j++)
{
for(i=0;i<wide;i++)
{
if (*p_data>128)
*p_data=255;
else
*p_data=0;
p_data++;
}
}
p_data=p_datatemp;
LPBYTE temp=new BYTE[wide*height]; //新圖像緩沖區
memset( temp,255,wide*height); //設定新圖像初值為255
for(i=0;i<wide;i++)
{
lBlackNum=0;
for(j=0;j<height;j++)
{
if(p_data[wide*j+i]==0)
lBlackNum++;
}
for(j=0;j<lBlackNum;j++)
temp[wide*j+i]=0;
}
memcpy(p_data, temp,wide*height);
delete temp;
}
void HuiDuBianHuanDib::RedZhiFangTu(float *tongji)
{
// 循環變量
int i;
int j;
// 灰度計數
int huidu[256];
int wide,height; //原圖長、寬
// 變量初始化
memset(huidu,0,sizeof(huidu));
wide=this->GetDibWidthBytes();
height=this->GetHeight ();
LPBYTE temp1=new BYTE[wide*height]; //新圖像緩沖區
//拷貝原圖像到緩存圖像
memcpy(temp1,m_pData,wide*height );
// 對各像素進行灰度統計
for (i = 0; i < height; i ++)
{
for (j = 0; j <wide; j=j +3)
{
unsigned char temp = temp1[wide* i + j] ;
// 灰度統計計數
huidu[temp]++;
}
}
// 計算灰度分布密度
for(i=0;i<256;i++)
tongji[i] = huidu[i] / (height * wide *1.0f);
}
void HuiDuBianHuanDib::BlueZhiFangTu(float *tongji)
{
// 循環變量
int i;
int j;
// 灰度計數
int huidu[256];
int wide,height; //原圖長、寬
// 變量初始化
memset(huidu,0,sizeof(huidu));
wide=this->GetDibWidthBytes();
height=this->GetHeight ();
LPBYTE temp1=new BYTE[wide*height]; //新圖像緩沖區
//拷貝原圖像到緩存圖像
memcpy(temp1,m_pData,wide*height );
// 對各像素進行灰度統計
for (i = 0; i < height; i ++)
{
for (j = 2; j <wide; j=j +3)
{
unsigned char temp = temp1[wide* i + j] ;
// 灰度統計計數
huidu[temp]++;
}
}
// 計算灰度分布密度
for(i=0;i<256;i++)
tongji[i] = huidu[i] / (height * wide *1.0f);
}
void HuiDuBianHuanDib::GreenZhiFangTu(float *tongji)
{
// 循環變量
int i;
int j;
// 灰度計數
int huidu[256];
int wide,height; //原圖長、寬
// 變量初始化
memset(huidu,0,sizeof(huidu));
wide=this->GetDibWidthBytes();
height=this->GetHeight ();
LPBYTE temp1=new BYTE[wide*height]; //新圖像緩沖區
//拷貝原圖像到緩存圖像
memcpy(temp1,m_pData,wide*height );
// 對各像素進行灰度統計
for (i = 0; i < height; i ++)
{
for (j = 1; j <wide; j=j +3)
{
unsigned char temp = temp1[wide* i + j] ;
// 灰度統計計數
huidu[temp]++;
}
}
// 計算灰度分布密度
for(i=0;i<256;i++)
tongji[i] = huidu[i] / (height * wide *1.0f);
}
//對24位彩色圖像進行灰度概率統計
void HuiDuBianHuanDib::ZhiFangTu(float *tongji1, float *tongji2, float *tongji3)
{
// 循環變量
int i;
int j;
// 灰度計數
int huidu1[256],huidu2[256],huidu3[256];
int wide,height; //原圖長、寬
wide=this->GetWidth ();
height=this->GetHeight ();
// 變量初始化
memset(huidu1,0,sizeof(huidu1));
memset(huidu2,0,sizeof(huidu2));
memset(huidu3,0,sizeof(huidu3));
LPBYTE temp_pData=new BYTE[wide*height*3]; //新圖像緩沖區
//拷貝原圖像到緩存圖像
memcpy(temp_pData,m_pData,wide*height*3);
// 對各像素進行灰度統計
for (j = 0; j < height; j ++)
{
for (i = 0; i <wide; i ++)
{
unsigned char temp1 = temp_pData[wide*j*3 + i*3] ;
unsigned char temp2 = temp_pData[wide*j*3 + i*3+1] ;
unsigned char temp3 = temp_pData[wide*j *3+ i*3+2] ;
// 灰度統計計數
huidu1[temp1]++;
huidu2[temp2]++;
huidu3[temp3]++;
}
}
// 計算灰度分布密度
for(i=0;i<256;i++)
{
tongji1[i] = huidu1[i] / (height * wide *1.0f);
tongji2[i] = huidu2[i] / (height * wide *1.0f);
tongji3[i] = huidu3[i] / (height * wide *1.0f);
}
}
void HuiDuBianHuanDib::Midufenbu(int *nNs_R, int *nNs_G, int *nNs_B)
{
// 循環變量
LONG i;
LONG j;
LONG wide;
LONG height;
//變量初始化
memset(nNs_R,0,sizeof(int) * 256);
memset(nNs_G,0,sizeof(int) * 256);
memset(nNs_B,0,sizeof(int) * 256);
// 指向DIB象素指針
LPBYTE p_data;
// 找到DIB圖像象素起始位置
p_data = this->GetData();
wide=this->GetWidth ();
// DIB的高度
height = GetHeight();
// 對各像素進行灰度轉換
for (j= 0;j < height;j ++)
{
for (i = 0; i <wide; i ++)
{
// 對各像素進行灰度統計
unsigned char temp = *((unsigned char *)p_data + wide * j*3 + i*3);
unsigned char temp2 = *((unsigned char *)p_data + wide * j*3 + i*3+1);
unsigned char temp3 = *((unsigned char *)p_data + wide * j*3 + i*3+2);
nNs_R[temp]++;
nNs_G[temp2]++;
nNs_B[temp3]++;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -