⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第3章 图象的平滑(去噪声)、锐化.htm

📁 介绍了图像的一些基本处理,如平滑,锐化
💻 HTM
📖 第 1 页 / 共 5 页
字号:
    <TD class=Normal width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      lang=EN-US><SUB><IMG height=99 src="第3章 图象的平滑(去噪声)、锐化.files/image051.gif" 
      width=159 v:shapes="_x0000_i1025"> </SUB></SPAN></P></TD>
    <TD class=Normal width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      lang=EN-US><SUB><IMG height=131 src="第3章 图象的平滑(去噪声)、锐化.files/image053.gif" 
      width=100 v:shapes="_x0000_i1026"> </SUB></SPAN></P></TD>
    <TD class=Normal width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      lang=EN-US><SUB><IMG height=93 src="第3章 图象的平滑(去噪声)、锐化.files/image055.gif" 
      width=59 v:shapes="_x0000_i1027"> </SUB></SPAN></P></TD>
    <TD class=Normal width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      lang=EN-US><SUB><IMG height=99 src="第3章 图象的平滑(去噪声)、锐化.files/image057.gif" 
      width=91 v:shapes="_x0000_i1028"> </SUB></SPAN></P></TD></TR></TBODY></TABLE>
<P style="LINE-HEIGHT: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">不难看出,原图中有很多噪声点</SPAN><SPAN lang=EN-US>(</SPAN><SPAN 
style="FONT-FAMILY: 宋体">灰度为正代表灰度值高的点,灰度为负代表灰度值低的点</SPAN><SPAN 
lang=EN-US>)</SPAN><SPAN 
style="FONT-FAMILY: 宋体">,而且是杂乱无章,随机分布的。这也是一类很典型的图,称之为高斯噪声。经过</SPAN><SPAN 
lang=EN-US>Box</SPAN><SPAN style="FONT-FAMILY: 宋体">平滑,噪声的程度有所下降。</SPAN><SPAN 
lang=EN-US>Gauss</SPAN><SPAN 
style="FONT-FAMILY: 宋体">模板对付高斯噪声非常有效。而中值滤波对于高斯噪声则无能为力。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">最后看第三幅图:</SPAN></P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
  <TBODY>
  <TR>
    <TD class=Normal vAlign=top width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      style="FONT-FAMILY: 宋体">原图</SPAN></P></TD>
    <TD class=Normal vAlign=top width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      style="FONT-FAMILY: 宋体">经</SPAN><SPAN lang=EN-US>Box</SPAN><SPAN 
      style="FONT-FAMILY: 宋体">模板处理后</SPAN></P></TD>
    <TD class=Normal vAlign=top width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      style="FONT-FAMILY: 宋体">经</SPAN><SPAN lang=EN-US>Gauss</SPAN><SPAN 
      style="FONT-FAMILY: 宋体">模板处理后</SPAN></P></TD>
    <TD class=Normal vAlign=top width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      style="FONT-FAMILY: 宋体">经中值滤波处理后</SPAN></P></TD></TR>
  <TR>
    <TD class=Normal width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      lang=EN-US><SUB><IMG height=71 src="第3章 图象的平滑(去噪声)、锐化.files/image059.gif" 
      width=105 v:shapes="_x0000_i1029"> </SUB></SPAN></P></TD>
    <TD class=Normal width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      lang=EN-US><SUB><IMG height=116 src="第3章 图象的平滑(去噪声)、锐化.files/image061.gif" 
      width=85 v:shapes="_x0000_i1030"> </SUB></SPAN></P></TD>
    <TD class=Normal width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      lang=EN-US><SUB><IMG height=116 src="第3章 图象的平滑(去噪声)、锐化.files/image063.gif" 
      width=76 v:shapes="_x0000_i1031"> </SUB></SPAN></P></TD>
    <TD class=Normal width=138>
      <P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN 
      lang=EN-US><SUB><IMG height=71 src="第3章 图象的平滑(去噪声)、锐化.files/image065.gif" 
      width=59 v:shapes="_x0000_i1032"> </SUB></SPAN></P></TD></TR></TBODY></TABLE>
<P style="LINE-HEIGHT: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">从原图中不难看出,中间的灰度要比两边高许多。这也是一类很典型的图,称之为脉冲</SPAN><SPAN 
lang=EN-US> (impulse)</SPAN><SPAN 
style="FONT-FAMILY: 宋体">。可见,中值滤波对脉冲噪声非常有效。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">综合以上三类图,不难得出下面的结论:中值滤波容易去除孤立点,线的噪声同时保持图象的边缘;它能很好的去除二值噪声,但对高斯噪声无能为力。要注意的是,当窗口内噪声点的个数大于窗口宽度的一半时,中值滤波的效果不好。这是很显然的。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">下面的程序实现了中值滤波,参数</SPAN><SPAN lang=EN-US>Hori</SPAN><SPAN 
style="FONT-FAMILY: 宋体">是一个布尔变量,若为真,做水平中值滤波,否则,做垂直中值滤波。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>BOOL MedianFilter(HWND hWnd,BOOL 
Hori)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>{</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt">DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
OffBits,BufSize;</P>
<P style="LINE-HEIGHT: 18pt">LPBITMAPINFOHEADER&nbsp;&nbsp;&nbsp; lpImgData;</P>
<P 
style="LINE-HEIGHT: 18pt">LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPtr;</P>
<P 
style="LINE-HEIGHT: 18pt">HLOCAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
hTempImgData;</P>
<P style="LINE-HEIGHT: 18pt">LPBITMAPINFOHEADER&nbsp;&nbsp;&nbsp; 
lpTempImgData;</P>
<P 
style="LINE-HEIGHT: 18pt">LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpTempPtr;</P>
<P 
style="LINE-HEIGHT: 18pt">HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
hDc;</P>
<P 
style="LINE-HEIGHT: 18pt">HFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hf;</P>
<P 
style="LINE-HEIGHT: 18pt">LONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x,y;</P>
<P 
style="LINE-HEIGHT: 18pt">int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g,g1,g2,g3;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//OffBits</SPAN><SPAN 
style="FONT-FAMILY: 宋体">为</SPAN><SPAN lang=EN-US>BITMAPINFOHEADER</SPAN><SPAN 
style="FONT-FAMILY: 宋体">结构长度加调色板的大小</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>BufSize=OffBits+bi.biHeight*LineBytes;//</SPAN><SPAN 
style="FONT-FAMILY: 宋体">要开的缓冲区的大小</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>{</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>MessageBox(hWnd,"Error alloc 
memory!","Error Message",MB_OK|</SPAN></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">lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);&nbsp;&nbsp;&nbsp; 
</P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN 
style="FONT-FAMILY: 宋体">拷贝头信息及位图数据</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>memcpy(lpTempImgData,lpImgData,BufSize);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN 
style="FONT-FAMILY: 宋体">注意边界点不处理,所以</SPAN><SPAN lang=EN-US>y</SPAN><SPAN 
style="FONT-FAMILY: 宋体">从</SPAN><SPAN lang=EN-US>1</SPAN><SPAN 
style="FONT-FAMILY: 宋体">到高度</SPAN><SPAN lang=EN-US>-2</SPAN><SPAN 
style="FONT-FAMILY: 宋体">,</SPAN><SPAN lang=EN-US>x</SPAN><SPAN 
style="FONT-FAMILY: 宋体">类似</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>for(y=1;y&lt;bi.biHeight-1;y++)</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>for(x=1;x&lt;bi.biWidth-1;x++){</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>g2=(unsigned char)*(lpPtr);</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>if(Hori){ //<SPAN style="FONT-FAMILY: 宋体">水平方向</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>g1=(unsigned char)*(lpPtr-1); //<SPAN 
style="FONT-FAMILY: 宋体">左邻点</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>g3=(unsigned char)*(lpPtr+1); //<SPAN 
style="FONT-FAMILY: 宋体">右邻点</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>}</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>else{ //<SPAN style="FONT-FAMILY: 宋体">垂直方向</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
g1=(unsigned char)*(lpPtr+LineBytes); //<SPAN 
style="FONT-FAMILY: 宋体">上邻点</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>g3=(unsigned char)*(lpPtr-LineBytes); //<SPAN 
style="FONT-FAMILY: 宋体">下邻点</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>}</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>//<SPAN style="FONT-FAMILY: 宋体">三者取中</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -