数字图像的增强技术
is);
UpdateData(TRUE);
//some prepare work for painting.
CWnd* pWnd = GetDlgItem(IDC_PIC);
CDC* pControlDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
CPen penD;
CBrush brush;
CPen* pOldPen;
CBrush* pOldBrush;
penD.CreatePen(PS_SOLID, 2, RGB(0,0,0));
brush.CreateSolidBrush(RGB(192, 192, 192));
pOldBrush = pControlDC->SelectObject(&brush);
//set the color degree bar according to the channel selected.
m_nChannel = m_ChannelCombo.GetCurSel();
for(int i=0;i
m_pen[i].DeleteObject();
if(m_nChannel == 2){
m_maxValue = m_max;
for(int i=0;i
m_Value[i] = m_L[i];
m_pen[i].CreatePen(PS_SOLID, 1, RGB(i,i,i));
}
}
if(m_nChannel == 3){
m_maxValue = m_max0;
for(int i=0;i
m_Value[i] = m_R[i];
m_pen[i].CreatePen(PS_SOLID, 1, RGB(i,0,0));
}
}
if(m_nChannel == 1){
m_maxValue = m_max1;
for(int i=0;i
m_Value[i] = m_G[i];
m_pen[i].CreatePen(PS_SOLID, 1, RGB(0,i,0));
}
}
if(m_nChannel == 0){
m_maxValue = m_max2;
for(int i=0;i
m_Value[i] = m_B[i];
m_pen[i].CreatePen(PS_SOLID, 1, RGB(0,0,i));
}
}
//drow the histogram and color bar.
pControlDC->Rectangle(0, 0, 258, 110);
pControlDC->Rectangle(0, 112, 258, 122);
pControlDC->SelectObject(pOldBrush);
for(i=0;i
{
pOldPen = pControlDC->SelectObject(&penD);
pControlDC->MoveTo(i+1, 110);
pControlDC->LineTo(i+1, 110-m_Value[i]);
pControlDC->SelectObject(pOldPen);
pOldPen = pControlDC->SelectObject(&m_pen[i]);
pControlDC->MoveTo(i+1, 113);
pControlDC->LineTo(i+1, 121);
pControlDC->SelectObject(pOldPen);
}
for(i=0;i
m_pen[i].DeleteObject();
char aMean[5];
long mean = 0;
for(i=0;i
mean += (m_Value[i]*m_maxValue/100*i);
mean = mean/(m_width*m_height);
_itoa(mean, aMean, 10);
m_MeanEdit.SetSel(0, -1);
m_MeanEdit.ReplaceSel(aMean);
char aPixels[5];
long pixels = m_width*m_height;
_itoa(pixels, aPixels, 10);
m_PixelsEdit.SetSel(0, -1);
m_PixelsEdit.ReplaceSel(aPixels);
//do the end work for paint.
pWnd->ReleaseDC(pControlDC);
UpdateData(FALSE);
}
BOOL CHistogamDlg::OnInitDialog()
{
CDialog::OnInitDialog();
for(int i=0;i
{
m_pen[i].CreatePen(PS_SOLID, 1, RGB(i,i,i));
}
m_ChannelCombo.AddString("Luminosity");
m_ChannelCombo.AddString("Red");
m_ChannelCombo.AddString("Green");
m_ChannelCombo.AddString("Blue");
m_ChannelCombo.SelectString(-1, "Luminosity");
UpdateData(FALSE);
return TRUE;
}
void CHistogamDlg::OnSelchangeCombo()
{
UpdateData(TRUE);
OnPaint();
UpdateData(FALSE);
}
void CHistogamDlg::OnLevelButton()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
long level = m_lLevel;
if(level>256){
level = m_lLevel = 255;
}
if(level
level = m_lLevel = 0;
}
m_count = m_Value[level]*m_maxValue/100;
double percentile = 0;
for(int i=0;i
percentile += m_Value[i]*m_maxValue/100;//*m_maxValue/100;
m_percentile = percentile*100/(double)(m_width*m_height);
UpdateData(FALSE);
}
*************************************************
Histogram equivalization.
parameter: HDIB
return: HDIB
*************************************************/
HDIB HistoEquivalizeDIB(HDIB hDib){
SetCursor(LoadCursor(NULL, IDC_WAIT));
DWORD dwDataLength = GlobalSize(hDib);
HDIB hNewDib = GlobalAlloc(GHND, dwDataLength);
if(!hNewDib){
SetCursor(LoadCursor(NULL, IDC_ARROW));
return NULL;
}
LPBYTE lpDIB = (LPBYTE)GlobalLock(hNewDib);
if(lpDIB == NULL){
SetCursor(LoadCursor(NULL, IDC_ARROW));
return NULL;
}
LPBYTE lpDIBSrc = (LPBYTE)GlobalLock(hDib);
memcpy(lpDIB, lpDIBSrc,
sizeof(BITMAPINFOHEADER)+PaletteSize(lpDIBSrc));
DWORD lSrcWidth = DIBWidth(lpDIBSrc);
DWORD lSrcHeight = DIBHeight(lpDIBSrc);
WORD wBitCount = ((LPBITMAPINFOHEADER)lpDIBSrc)->biBitCount;
DWORD lSrcRowBytes = WIDTHBYTES(lSrcWidth*((DWORD)wBitCount));
LPBYTE lpOldBits = FindDIBBits(lpDIBSrc);
LPBYTE lpData = FindDIBBits(lpDIB);
//图像变换开始//////////////////////////////////////////
DWORD i, j;
if(wBitCount == 8){
//统计各亮度的象素点个数
double v[256];
for(i=0;i
for(i=0;i
for(j=0;j
v[*(lpOldBits+lSrcRowBytes*i+j)] += 1.0;
//计算均衡化后各亮度的新值
double percentile[256];
for(i=0;i
percentile[i]=0.0;
for(j=0;j
percentile[i] += v[j];
percentile[i] *= (255.0/(double)(lSrcWidth*lSrcHeight));
}
//更新图像
for(i=0;i
for(j=0;j
*(lpData+lSrcRowBytes*i+j)=
(BYTE)(percentile[*(lpOldBits+lSrcRowBytes*i+j)]);
}
if(wBitCount == 24){
double r[256], g[256], b[256];
for(i=0;i
for(i=0;i
for(j=0;j
r[*(lpOldBits+lSrcRowBytes*i+j*3)] += 1.0;
g[*(lpOldBits+lSrcRowBytes*i+j*3+1)] += 1.0;
b[*(lpOldBits+lSrcRowBytes*i+j*3+2)] += 1.0;
}
double pr[256], pg[256], pb[256];
for(i=0;i
pr[i] = pg[i] = pb[i] = 0.0;
for(j=0;j
pr[i] += r[j];
pg[i] += g[j];
pb[i] += b[i];
}
pr[i] *= (255.0/(double)(lSrcWidth*lSrcHeight));
pg[i] *= (255.0/(double)(lSrcWidth*lSrcHeight));
pb[i] *= (255.0/(double)(lSrcWidth*lSrcHeight));
}
for(i=0;i
for(j=0;j
*(lpData+lSrcRowBytes*i+j*3)=
(BYTE)(pr[*(lpOldBits+lSrcRowBytes*i+j*3)]);
*(lpData+lSrcRowBytes*i+j*3+1)=
(BYTE)(pg[*(lpOldBits+lSrcRowBytes*i+j*3+1)]);
*(lpData+lSrcRowBytes*i+j*3+2)=
(BYTE)(pb[*(lpOldBits+lSrcRowBytes*i+j*3+2)]);
}
}
GlobalUnlock(hDib);
GlobalUnlock(hNewDib);
SetCursor(LoadCursor(NULL, IDC_ARROW));
return hNewDib;
}