寻求图像增强算法 一幅灰度图像,边界处模糊不清,如何将图像清晰化,寻求算法,最好有现成的代码,急!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 锐化处理#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;} 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; } LoadBmpFile("loadfile.bmp");TemplateOperation("savename.bmp",TEMPLATE_SHARPEN_LAPLACIAN) qqhuangshen(雨淋淋) 厉害! 可以把你的原码贴上来吗?或发到我邮箱里 [email protected]万分感谢!! 用lanstar200(码雅哥布林)的代码试了下,图像中原先看不清楚的部分现在都看清楚了,但图像却严重失真,在有些场合会很有用,但不满足我所要应用的场合,码雅哥布林,多谢了!! 在 数字图像处理(第二版)(作者:Rafael C. Gonzalez,Richard E.Woods )上 191页 有一幅胸透图片的处理效果图,效果相当好!!有哪位知道所采用的算法、步骤,望不吝指教。最好有原代码 qqhuangshen(雨淋淋) ,可以提供你的代码吗?多谢了! SubclassDlgItem引起的困扰 spy++捕获不到消息的原因有哪些?? 问个低级的问题---惭愧…… 请问有没有可以实现复制、粘贴的表格控件 [急!!!!]在用ATL写ActiveX的开发过程中,怎么删除一个方法? CDateTimeCtrl::SetTime使用求助 寻找效果好的锐化算法,最好有源代码,谢谢 IP欺骗怎么实现? 帮我参考一哈,50分相送 大家帮忙看看这个错误是怎么回事? 菜鸟问题:请教一下DrawText的显示问题 求教:渐变色问题
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;
}
{
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;
}
TemplateOperation("savename.bmp",TEMPLATE_SHARPEN_LAPLACIAN)
万分感谢!!