各位大侠,我想把从摄像头拍出来的24位图象,转换成黑白图象,主要是用来提取字符,摄像头所拍的为在白纸上打印的字符,请问,怎么才能正确的转换呢?

解决方案 »

  1.   

    如果自己写代码,就将彩色的转成256灰度的,然后再二值化
    估计普通的二值化算法效果不行,得用局部阈值二值化算法
    如果不想自己写代码,可以看看CxImage类,它的demo有这些功能
      

  2.   

    如果你没有其它的源码,下载一个CxImage类吧,那上面功能好像挺全的.
    它有demo程序,你想要的功能基本上都有
      

  3.   

    opencv 函数
    cvCanny就可以做到了
      

  4.   

    http://blog.csdn.net/rageliu/archive/2007/11/02/1864279.aspx
      

  5.   

    恩,谢谢,我在codeproject网上下了个了这个的源代码,我看了他做的demo,里面内容挺多的,不过我还没找到转换成黑白的,谢谢啊
      

  6.   

    to: rageliu
    你上面说的根据像素去进行转换,那怎么知道把图片中那个像素对应的颜色转换成黑,哪个转换成白呢,着中间有什么方法吗,谢谢
      

  7.   

    请问hndxh3000:
    您说的着两个函数怎么用呢?
      

  8.   

    24位转8位的代码
    #define   WIDTHBYTES(i)         ((i+31)/32*4) 
    BITMAPFILEHEADER       bf;   
    BITMAPINFOHEADER       bi;   
    HPALETTE                       hPalette=NULL;   
    HBITMAP                         hBitmap=NULL;   
    HGLOBAL                         hImgData=NULL;   
    DWORD                             NumColors;   
    DWORD                             LineBytes;   
    HINSTANCE                     ghInst;   
    DWORD                             ImgWidth=0   ,   ImgHeight=0;   
    int   GrayTable[256];   
    int   MaxGrayNum;   
    int   MinGrayNum;   
    int   FirstPoint=0,   SecondPoint=255;   
    float   StretchRatio=2.0f;   
    int   EquaScale;BOOL CDispBmpView::ColorToGray(LPCSTR BmpFileName)
    {
    DWORD SrcBufSize,DstBufSize,DstLineBytes; 
    LPBITMAPINFOHEADER lpImgData; 
    LPSTR lpPtr; 
    HLOCAL hTempImgData; 
    LPBITMAPINFOHEADER lpTempImgData; 
    LPSTR lpTempPtr; 
    HDC hDc; 
    HFILE hf; 
    LONG x,y; 
    BITMAPFILEHEADER DstBf; 
    BITMAPINFOHEADER DstBi; 
     LOGPALETTE *pPal; 
     HPALETTE hPrevPalette; 
    HLOCAL hPal; 
    DWORD NewNumColors; 
    WORD NewBitCount; 
    float Y; 
    DWORD i; 
    unsigned char Red,Green,Blue,Gray;  NewNumColors=NumColors; 
    NewBitCount=bi.biBitCount; 
    if(NumColors==0) //true color 

    NewNumColors=256; 
    NewBitCount=8; 
    }  DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount); 
    DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NewNumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*bi.biHeight); 
    memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER)); 
    memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER)); 
    DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER); 
    DstBf.bfOffBits=(DWORD)(NewNumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER) 
    +sizeof(BITMAPINFOHEADER)); 
    DstBi.biClrUsed=0; 
    DstBi.biBitCount=NewBitCount;  SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);  if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL) 
     { 
     MessageBox("Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION); 
     return FALSE; 
     }   lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); 
    lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);  //copy image data 
    memcpy(lpTempImgData,lpImgData,DstBufSize); 
    //overwrite bitmapinfoheader with the new one 
    memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER));  lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER); 
    lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);   hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NewNumColors* sizeof(PALETTEENTRY)); 
     pPal =(LOGPALETTE *)LocalLock(hPal); 
     pPal->palNumEntries =(WORD) NewNumColors; 
    pPal->palVersion = 0x300;  if(NumColors==0) //true color 
    for (i = 0; i < 256; i++) { 
    pPal->palPalEntry[i].peRed=(BYTE)i; 
    pPal->palPalEntry[i].peGreen=(BYTE)i; 
    pPal->palPalEntry[i].peBlue=(BYTE)i; 
    pPal->palPalEntry[i].peFlags=(BYTE)0; 
    *(lpTempPtr++)=(unsigned char)i; 
    *(lpTempPtr++)=(unsigned char)i; 
    *(lpTempPtr++)=(unsigned char)i; 
    *(lpTempPtr++)=0; 

    else 
    for (i = 0; i < NewNumColors; i++) { 
    Blue=(unsigned char )(*lpPtr++); 
    Green=(unsigned char )(*lpPtr++); 
    Red=(unsigned char )(*lpPtr++); 
    Y=(float)(Red*0.299+Green*0.587+Blue*0.114); 
    Gray=(BYTE)Y; 
    lpPtr++; 
    pPal->palPalEntry[i].peRed=Gray; 
    pPal->palPalEntry[i].peGreen=Gray; 
    pPal->palPalEntry[i].peBlue=Gray; 
    pPal->palPalEntry[i].peFlags=0; 
    *(lpTempPtr++)=(unsigned char)Gray; 
    *(lpTempPtr++)=(unsigned char)Gray; 
    *(lpTempPtr++)=(unsigned char)Gray; 
    *(lpTempPtr++)=0; 
    }  if(hPalette!=NULL) 
     DeleteObject(hPalette);  hPalette=CreatePalette(pPal); 
    LocalUnlock(hPal); 
    LocalFree(hPal);  hDc=::GetDC(m_hWnd); 
    if(hPalette){ 
     hPrevPalette=SelectPalette(hDc,hPalette,FALSE); 
    RealizePalette(hDc); 
    }  if(NumColors==0) 
    for(y=0;y<bi.biHeight;y++){ 
    lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes); 
    lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y*DstLineBytes); 
    for(x=0;x<bi.biWidth;x++){ 
    Blue=(unsigned char )(*lpPtr++); 
    Green=(unsigned char )(*lpPtr++); 
    Red=(unsigned char )(*lpPtr++); 
    Y=(float)(Red*0.299+Green*0.587+Blue*0.114); 
    Gray=(BYTE)Y; 
    *(lpTempPtr++)=(unsigned char)Gray; 

    }   if(hBitmap!=NULL) 
     DeleteObject(hBitmap);  hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT, 
    (LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NewNumColors*sizeof(RGBQUAD), 
    (LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);  if(hPalette && hPrevPalette){ 
    SelectPalette(hDc,hPrevPalette,FALSE); 
    RealizePalette(hDc); 
    }   hf=_lcreat(BmpFileName,0); 
    _lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); 
    _lwrite(hf,(LPSTR)lpTempImgData,DstBufSize); 
    _lclose(hf);  ::ReleaseDC(m_hWnd,hDc); 
    LocalUnlock(hTempImgData); 
    LocalFree(hTempImgData); 
    GlobalUnlock(hImgData); 
    return TRUE;
    }
      

  9.   


    BOOL CDispBmpView::LoadBmpFile(LPCSTR BmpFileName)
    {
    HFILE hf; 
    LPBITMAPINFOHEADER lpImgData; 
    LOGPALETTE *pPal; 
    LPRGBQUAD lpRGB; 
    HPALETTE hPrevPalette; 
    HDC hDc; 
    HLOCAL hPal; 
    DWORD ImgSize; 
    DWORD i;  if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR){ 
     MessageBox("Can not Load file","Error",MB_OK|MB_ICONEXCLAMATION); 
     return FALSE; 

    _lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 
    _lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER)); 
    ImgWidth=bi.biWidth; 
    ImgHeight=bi.biHeight; 
    LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); 
    ImgSize=(DWORD)LineBytes*bi.biHeight; 
    if(bi.biClrUsed!=0) 
    NumColors=(DWORD)bi.biClrUsed; 
    else 
     switch(bi.biBitCount){ 
    case 1: 
    NumColors=2; 
    break; 
    case 4: 
    NumColors=16; 
    break; 
    case 8: 
    NumColors=256; 
    break; 
    case 24: 
    NumColors=0; 
    break; 
    case 32: 
    NumColors=0; 
    break; 
    default: 
    MessageBox("Invalid color numbers!","Error Message",MB_OK|MB_ICONEXCLAMATION); 
    _lclose(hf); 
    return FALSE; 
    NumColors = 0; 
    break; 
    }  if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER) 
    +sizeof(BITMAPINFOHEADER))) 

    MessageBox("Invalid color numbers!","Error Message" ,MB_OK| 
    MB_ICONEXCLAMATION); 
    _lclose(hf); 
    return FALSE; 
    }  bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize; 
    if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+ 
    NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL) 

    MessageBox("Error alloc memory!","ErrorMessage",MB_OK| 
    MB_ICONEXCLAMATION); 
    _lclose(hf); 
    return FALSE; 
    }  lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); 
    _llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN); 
    _hread(hf,(char *)lpImgData,(long)sizeof(BITMAPINFOHEADER) 
    +(long)NumColors*sizeof(RGBQUAD)+ImgSize); 
    _lclose(hf); 
    if(NumColors!=0) 

    hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY)); 
    pPal =(LOGPALETTE *)LocalLock(hPal); 
    pPal->palNumEntries =(WORD) NumColors; 
    pPal->palVersion = 0x300; 
    lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER)); 
    for (i = 0; i < NumColors; i++) { 
    pPal->palPalEntry[i].peRed=lpRGB->rgbRed; 
    pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen; 
    pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue; 
    pPal->palPalEntry[i].peFlags=(BYTE)0; 
    lpRGB++; 

    hPalette=CreatePalette(pPal); 
    LocalUnlock(hPal); 
    LocalFree(hPal); 

    hDc=::GetDC(m_hWnd); 
    if(hPalette){ 
     hPrevPalette=SelectPalette(hDc,hPalette,FALSE); 
    RealizePalette(hDc); 

    hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT, 
    (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD), 
    (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS); 
    if(hPalette && hPrevPalette){ 
    SelectPalette(hDc,hPrevPalette,FALSE); 
    RealizePalette(hDc); 
    }  ::ReleaseDC(m_hWnd,hDc); 
    GlobalUnlock(hImgData); 
    GetDocument()->SetTitle( BmpFileName ); 
    return TRUE; 
    }使用
    if(LoadBmpFile(filename))   
    {   
    if(ColorToGray(filename))
    {
    AfxMessageBox("Save successful !");
    }
    }
      

  10.   

    我来看看,
    GDI+怎么转存24位位图呢?