一幅灰度图像,边界处模糊不清,如何将图像清晰化,寻求算法,最好有现成的代码,急!!!

解决方案 »

  1.   

    锐化处理#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;#define TEMPLATE_SMOOTH_BOX          1 //Box平滑模板
    #define TEMPLATE_SMOOTH_GAUSS        2 //高斯平滑模板
    #define TEMPLATE_SHARPEN_LAPLACIAN   3 //拉普拉斯锐化模板float Template_Smooth_Box[9]={1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f};
    float Template_Smooth_Gauss[9]={1.0f,2.0f,1.0f,2.0f,4.0f,2.0f,1.0f,2.0f,1.0f};
    float Template_Sharpen_Laplacian[9]={-1.0f,-1.0f,-1.0f,-1.0f,9.0f,-1.0f,-1.0f,-1.0f,-1.0f};BOOL CMyView::TemplateOperation(LPCSTR BmpFileName, int TemplateType)
    {
    DWORD              OffBits,BufSize;
        LPBITMAPINFOHEADER lpImgData;
    LPSTR              lpPtr;
    HLOCAL             hTempImgData;
    LPBITMAPINFOHEADER lpTempImgData;
    LPSTR              lpTempPtr;
    HDC                hDc;
    HFILE              hf;
    LONG               x,y;
    float              coef;
    float              CoefArray[9];
    float              TempNum; switch(TemplateType){
    case TEMPLATE_SMOOTH_BOX:
    coef=(float)(1.0/9.0);
    memcpy(CoefArray,Template_Smooth_Box,9*sizeof(float));
    break;
    case TEMPLATE_SMOOTH_GAUSS:
    coef=(float)(1.0/16.0);
    memcpy(CoefArray,Template_Smooth_Gauss,9*sizeof(float));
    break;
    case TEMPLATE_SHARPEN_LAPLACIAN:
    coef=(float)1.0;
    memcpy(CoefArray,Template_Sharpen_Laplacian,9*sizeof(float));
    break;
    } OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
    BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER); if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
        {
         MessageBox("Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
            return FALSE;
        }    lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);    
    lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); lpPtr=(char *)lpImgData;
    lpTempPtr=(char *)lpTempImgData; memcpy(lpTempPtr,lpPtr,BufSize); for(y=1;y<bi.biHeight-1;y++)
    for(x=1;x<bi.biWidth-1;x++){
    lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;
    lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;
    TempNum=(float)((unsigned char)*(lpPtr+LineBytes-1))*CoefArray[0];
    TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*CoefArray[1];
    TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*CoefArray[2];
    TempNum+=(float)((unsigned char)*(lpPtr-1))*CoefArray[3];
    TempNum+=(float)((unsigned char)*lpPtr)*CoefArray[4];
    TempNum+=(float)((unsigned char)*(lpPtr+1))*CoefArray[5];
    TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*CoefArray[6];
    TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*CoefArray[7];
    TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*CoefArray[8];
    TempNum*=coef;
    if(TempNum>255.0) *lpTempPtr=(BYTE)255;
    else if(TempNum<0.0) 
    *lpTempPtr=(unsigned char)fabs(TempNum);
    else *lpTempPtr=(BYTE)TempNum;
    } hDc=::GetDC(m_hWnd);
        if(hBitmap!=NULL)
        DeleteObject(hBitmap);

    hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
    (LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
        (LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS); hf=_lcreat(BmpFileName,0);
    _lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 
    _lwrite(hf,(LPSTR)lpTempImgData,BufSize);
    _lclose(hf); ::ReleaseDC(m_hWnd,hDc);
    LocalUnlock(hTempImgData);
    LocalFree(hTempImgData);
    GlobalUnlock(hImgData);
    return TRUE;
    }
      

  2.   

    BOOL CMyView::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);
    return TRUE; 
    }
      

  3.   

    LoadBmpFile("loadfile.bmp");
    TemplateOperation("savename.bmp",TEMPLATE_SHARPEN_LAPLACIAN)
      

  4.   

    qqhuangshen(雨淋淋) 厉害! 可以把你的原码贴上来吗?或发到我邮箱里 [email protected]
    万分感谢!!
      

  5.   

    用lanstar200(码雅哥布林)的代码试了下,图像中原先看不清楚的部分现在都看清楚了,但图像却严重失真,在有些场合会很有用,但不满足我所要应用的场合,码雅哥布林,多谢了!!
      

  6.   

    在 数字图像处理(第二版)(作者:Rafael C. Gonzalez,Richard E.Woods )上 191页 有一幅胸透图片的处理效果图,效果相当好!!有哪位知道所采用的算法、步骤,望不吝指教。最好有原代码  qqhuangshen(雨淋淋) ,可以提供你的代码吗?多谢了!