📄 第3章 图象的平滑(去噪声)、锐化.htm
字号:
<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
OffBits,BufSize;</P>
<P style="LINE-HEIGHT: 18pt">LPBITMAPINFOHEADER lpImgData;</P>
<P
style="LINE-HEIGHT: 18pt">LPSTR
lpPtr;</P>
<P
style="LINE-HEIGHT: 18pt">HLOCAL
hTempImgData;</P>
<P style="LINE-HEIGHT: 18pt">LPBITMAPINFOHEADER
lpTempImgData;</P>
<P
style="LINE-HEIGHT: 18pt">LPSTR
lpTempPtr;</P>
<P
style="LINE-HEIGHT: 18pt">HDC
hDc;</P>
<P
style="LINE-HEIGHT: 18pt">HFILE
hf;</P>
<P
style="LINE-HEIGHT: 18pt">LONG
x,y;</P>
<P
style="LINE-HEIGHT: 18pt">int
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);
</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<bi.biHeight-1;y++)</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>for(x=1;x<bi.biWidth-1;x++){</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>
</SPAN>g2=(unsigned char)*(lpPtr);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>if(Hori){ //<SPAN style="FONT-FAMILY: 宋体">水平方向</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>g1=(unsigned char)*(lpPtr-1); //<SPAN
style="FONT-FAMILY: 宋体">左邻点</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>g3=(unsigned char)*(lpPtr+1); //<SPAN
style="FONT-FAMILY: 宋体">右邻点</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>}</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>else{ //<SPAN style="FONT-FAMILY: 宋体">垂直方向</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN> </SPAN>
g1=(unsigned char)*(lpPtr+LineBytes); //<SPAN
style="FONT-FAMILY: 宋体">上邻点</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>g3=(unsigned char)*(lpPtr-LineBytes); //<SPAN
style="FONT-FAMILY: 宋体">下邻点</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>}</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>//<SPAN style="FONT-FAMILY: 宋体">三者取中</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -