📄 第3章 图象的平滑(去噪声)、锐化.htm
字号:
</SPAN>HDC
hDc;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>HFILE
hf;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>LONG
x,y;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>float
coef; //<SPAN style="FONT-FAMILY: 宋体">模板前面所乘的系数</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>int
CoefArray[9]; //<SPAN
style="FONT-FAMILY: 宋体">模板数组</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>float
TempNum;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>char
filename[80];</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>switch(TemplateType){ //<SPAN style="FONT-FAMILY: 宋体">判断模板类型</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>case TEMPLATE_SMOOTH_BOX: //Box<SPAN
style="FONT-FAMILY: 宋体">平滑模板</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>coef=(float)(1.0/9.0);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>memcpy(CoefArray,Template_Smooth_Box,9*sizeof(int));</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>strcpy(filename,"c:\\smbox.bmp"); </P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>break;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>case TEMPLATE_SMOOTH_GAUSS: //<SPAN
style="FONT-FAMILY: 宋体">高斯平滑模板</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>coef=(float)(1.0/16.0);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>memcpy(CoefArray,Template_Smooth_Gauss,9*sizeof(int));</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>strcpy(filename,"c:\\smgauss.bmp");</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>break;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>case TEMPLATE_SHARPEN_LAPLACIAN: //<SPAN
style="FONT-FAMILY: 宋体">拉普拉斯锐化模板</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>coef=(float)1.0;</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>memcpy(CoefArray,Template_Sharpen_Laplacian,9*sizeof(int));</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>strcpy(filename,"c:\\shlaplac.bmp");</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>break;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>}</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>BufSize=OffBits+bi.biHeight*LineBytes;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>{</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN> MessageBox(hWnd,"Error
alloc memory!","Error Message",MB_OK|</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>MB_ICONEXCLAMATION);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>return FALSE;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN> </SPAN>
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); </P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>lpPtr=(char *)lpImgData;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>lpTempPtr=(char *)lpTempImgData;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN
style="FONT-FAMILY: 宋体">先将原图直接拷贝过来,其实主要是拷贝周围一圈的象素</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>memcpy(lpTempPtr,lpPtr,BufSize); </P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>for(y=1;y<bi.biHeight-1;y++) //<B><SPAN
style="FONT-FAMILY: 黑体">注意<SPAN
lang=EN-US>y的范围是从1到bi.biHeight-2</SPAN></SPAN></B></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>for(x=1;x<bi.biWidth-1;x++){ //<B><SPAN
style="FONT-FAMILY: 黑体">注意<SPAN
lang=EN-US>x的范围是从1到bi.biWidth-2</SPAN></SPAN></B></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>lpTempPtr=(char*)lpTempImgData+</P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>(BufSize-LineBytes-y*LineBytes)+x;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>TempNum=(float)((unsigned
char)*(lpPtr+LineBytes-1))*</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>CoefArray[0];</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>CoefArray[1];</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>CoefArray[2];</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>TempNum+=(float)((unsigned char)*(lpPtr-1))*CoefArray[3];</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>TempNum+=(float)((unsigned char)*lpPtr)*CoefArray[4];</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>TempNum+=(float)((unsigned char)*(lpPtr+1))*CoefArray[5];</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>CoefArray[6];</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>CoefArray[7];</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>CoefArray[8];</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>//<SPAN style="FONT-FAMILY: 宋体">最后乘以系数</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>TempNum*=coef;</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>//<B><SPAN style="FONT-FAMILY: 黑体">注意对溢出点的处理</SPAN></B></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>if(TempNum>255.0) *lpTempPtr=(BYTE)255;</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>else if(TempNum<0.0) </P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>*lpTempPtr=(unsigned char)fabs(TempNum);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>else *lpTempPtr=(BYTE)TempNum;</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>}</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>hDc=GetDC(hWnd);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN> </SPAN>
if(hBitmap!=NULL)</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN> DeleteObject(hBitmap);</P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(LONG)CBM_INIT,</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(LPSTR)lpTempImgData+</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>sizeof(BITMAPINFOHEADER)+</SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -