📄 第2章 图象的几何变换.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://www-scf.usc.edu/~flv/ipbook/chap02.htm -->
<HTML><HEAD><TITLE>第2章 图象的几何变换</TITLE>
<META http-equiv=Content-Type content="text/html; charset=GB2312"><LINK
href="./chap02.files/editdata.mso" rel=Edit-Time-Data><LINK
href="./chap02.files/oledata.mso" rel=OLE-Object-Data>
<STYLE>.Normal {
TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10.5pt; TEXT-INDENT: 0pt; LINE-HEIGHT: normal; FONT-FAMILY: "Times New Roman"; TEXT-ALIGN: justify
}
.a {
FONT-SIZE: 12pt; TEXT-INDENT: 0pt; LINE-HEIGHT: 20pt; FONT-FAMILY: "Times New Roman"; TEXT-ALIGN: center
}
</STYLE>
<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY class=Normal lang=ZH-CN vLink=purple link=blue bgColor=#ffffff>
<DIV style="LAYOUT-GRID: 15.6pt none">
<H1><A name=_Toc486331867></A><A name=_Toc486332867></A><A
name=_Toc486338976></A><A name=_Toc454810841></A><A
name=_Toc454856615><SPAN><SPAN>第<SPAN
lang=EN-US>2</SPAN></SPAN></SPAN></A><SPAN><SPAN><SPAN
style="FONT-FAMILY: 黑体">章</SPAN> </SPAN></SPAN><SPAN><SPAN><SPAN
style="FONT-FAMILY: 黑体">图象的几何变换</SPAN></SPAN></SPAN></H1>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋体">这一章我们将介绍图象的几何变换,包括图象的平移、旋转、镜象变换、转置、放缩等。如果你熟悉矩阵运算,你将发现,实现这些变换是非常容易的。</SPAN></P>
<H2><SPAN lang=EN-US>2.1</SPAN> <SPAN lang=EN-US></SPAN><A
name=_Toc486331868></A><A name=_Toc486332868></A><A name=_Toc486338977></A><A
name=_Toc454810842></A><A
name=_Toc454856616><SPAN><SPAN>平移</SPAN></SPAN></A></H2>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">平移</SPAN><SPAN
lang=EN-US>(translation)</SPAN><SPAN
style="FONT-FAMILY: 宋体">变换大概是几何变换中最简单的一种了。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">如图</SPAN><SPAN
lang=EN-US>2.1</SPAN><SPAN style="FONT-FAMILY: 宋体">所示,初始坐标为</SPAN><SPAN
lang=EN-US>(x<SUB>0</SUB>,y<SUB>0</SUB>)</SPAN><SPAN
style="FONT-FAMILY: 宋体">的点经过平移</SPAN><SPAN
lang=EN-US>(t<SUB>x</SUB>,t<SUB>y</SUB>)(</SPAN><SPAN
style="FONT-FAMILY: 宋体">以向右,向下为正方向</SPAN><SPAN lang=EN-US>)</SPAN><SPAN
style="FONT-FAMILY: 宋体">后,坐标变为</SPAN><SPAN
lang=EN-US>(x<SUB>1</SUB>,y<SUB>1</SUB>)</SPAN><SPAN
style="FONT-FAMILY: 宋体">。这两点之间的关系是</SPAN><SPAN
lang=EN-US>x<SUB>1</SUB>=x<SUB>0</SUB>+t<SUB>x </SUB></SPAN><SPAN
style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>y<SUB>1</SUB>=y<SUB>0</SUB>+t<SUB>y</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋体">。</SPAN></P>
<P class=a><SPAN lang=EN-US><IMG height=203 src="第2章 图象的几何变换.files/image002.jpg"
width=195 v:shapes="_x0000_i1025"> </SPAN></P>
<P style="TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋体">图</SPAN>2.1 </B><B><SPAN
style="FONT-FAMILY: 宋体">平移的示意图</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">以矩阵的形式表示为</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><SUB><IMG height=77 src="第2章 图象的几何变换.files/image004.gif" width=244
v:shapes="_x0000_i1067"> </SUB></SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: right"
align=right><SPAN>
</SPAN>(2.1)</P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋体">我们更关心的是它的逆变换:</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><SUB><IMG height=77 src="第2章 图象的几何变换.files/image006.gif" width=268
v:shapes="_x0000_i1038"> </SUB></SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: right" align=right><SPAN
lang=EN-US>(2.2)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋体">这是因为:我们想知道的是平移后的图象中每个象素的颜色。例如我们想知道,新图中左上角点的</SPAN><SPAN
lang=EN-US>RGB</SPAN><SPAN
style="FONT-FAMILY: 宋体">值是多少?很显然,该点是原图的某点经过平移后得到的,这两点的颜色肯定是一样的,所以只要知道了原图那点的</SPAN><SPAN
lang=EN-US>RGB</SPAN><SPAN
style="FONT-FAMILY: 宋体">值即可。那么到底新图中的左上角点对应原图中的哪一点呢?将左上角点的坐标</SPAN><SPAN
lang=EN-US>(0,0)</SPAN><SPAN style="FONT-FAMILY: 宋体">入公式</SPAN><SPAN
lang=EN-US>(2.2)</SPAN><SPAN style="FONT-FAMILY: 宋体">,得到</SPAN><SPAN
lang=EN-US>x<SUB>0=</SUB>-t<SUB>x </SUB></SPAN><SPAN
style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>y<SUB>0</SUB>=-t<SUB>y</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋体">;所以新图中的</SPAN><SPAN lang=EN-US>(0,0)</SPAN><SPAN
style="FONT-FAMILY: 宋体">点的颜色和原图中</SPAN><SPAN lang=EN-US>(-t<SUB>x</SUB> ,
-t<SUB>y</SUB>)</SPAN><SPAN style="FONT-FAMILY: 宋体">的一样。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋体">这样就存在一个问题:如果新图中有一点</SPAN><SPAN
lang=EN-US>(x<SUB>1</SUB>,y<SUB>1</SUB>)</SPAN><SPAN
style="FONT-FAMILY: 宋体">,按照公式</SPAN><SPAN lang=EN-US>(2.2)</SPAN><SPAN
style="FONT-FAMILY: 宋体">得到的</SPAN><SPAN
lang=EN-US>(x<SUB>0</SUB>,y<SUB>0</SUB>)</SPAN><SPAN
style="FONT-FAMILY: 宋体">不在原图中该怎么办?通常的做法是,把该点的</SPAN><SPAN
lang=EN-US>RGB</SPAN><SPAN style="FONT-FAMILY: 宋体">值统一设成</SPAN><SPAN
lang=EN-US>(0,0,0)</SPAN><SPAN style="FONT-FAMILY: 宋体">或者</SPAN><SPAN
lang=EN-US>(255,255,255)</SPAN><SPAN style="FONT-FAMILY: 宋体">。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋体">另一个问题是:平移后的图象是否要放大?一种做法是不放大,移出的部分被截断。例如,图</SPAN><SPAN
lang=EN-US>2.2</SPAN><SPAN style="FONT-FAMILY: 宋体">为原图,图</SPAN><SPAN
lang=EN-US>2.3</SPAN><SPAN
style="FONT-FAMILY: 宋体">为移动后的图。这种处理,文件大小不会改变。</SPAN></P>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=193
src="第2章 图象的几何变换.files/image008.gif" width=306 v:shapes="_x0000_i1068">
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋体">图</SPAN>2.2 </B><B><SPAN
style="FONT-FAMILY: 宋体">移动前的图</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
lang=EN-US><IMG height=195 src="第2章 图象的几何变换.files/image010.gif" width=308
v:shapes="_x0000_i1069"> </SPAN></B></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋体">图</SPAN>2.3 </B><B><SPAN
style="FONT-FAMILY: 宋体">移动后的图</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋体">还有一种做法是:将图象放大,使得能够显示下所有部分,如图</SPAN><SPAN
lang=EN-US>2.4</SPAN><SPAN style="FONT-FAMILY: 宋体">所示。</SPAN></P>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=244
src="第2章 图象的几何变换.files/image012.gif" width=362 v:shapes="_x0000_i1070">
</SPAN></P>
<P class=a style="LINE-HEIGHT: 18pt"><B><SPAN
style="FONT-FAMILY: 宋体">图</SPAN>2.4 </B><B><SPAN
style="FONT-FAMILY: 宋体">移动后图象被放大</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋体">这种处理,文件大小要改变。设原图的宽和高分别是</SPAN><SPAN
lang=EN-US>w<SUB>1</SUB>,h<SUB>1</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋体">则新图的宽和高变为</SPAN><SPAN
lang=EN-US>w<SUB>1</SUB>+|t<SUB>x</SUB>|</SPAN><SPAN
style="FONT-FAMILY: 宋体">和</SPAN><SPAN
lang=EN-US>h<SUB>1</SUB>+|t<SUB>y</SUB>|</SPAN><SPAN
style="FONT-FAMILY: 宋体">,加绝对值符号是因为</SPAN><SPAN lang=EN-US>t<SUB>x</SUB>,
t<SUB>y</SUB></SPAN><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></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">下面的函数</SPAN><SPAN
lang=EN-US>Translation</SPAN><SPAN
style="FONT-FAMILY: 宋体">采用的是第一种做法,即移出的部分被截断。在给出源代码之前,先说明一个问题。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">如果你用过</SPAN><SPAN
lang=EN-US>Photoshop,Corel PhotoPaint</SPAN><SPAN
style="FONT-FAMILY: 宋体">等图象处理软件,可能听说过“灰度图”</SPAN><SPAN
lang=EN-US>(grayscale)</SPAN><SPAN
style="FONT-FAMILY: 宋体">这个词。灰度图是指只含亮度信息,不含色彩信息的图象,就象我们平时看到的黑白照片:亮度由暗到明,变化是连续的。因此,要表示灰度图,就需要把亮度值进行量化。通常划分成</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN style="FONT-FAMILY: 宋体">到</SPAN><SPAN
lang=EN-US>255</SPAN><SPAN style="FONT-FAMILY: 宋体">共</SPAN><SPAN
lang=EN-US>256</SPAN><SPAN style="FONT-FAMILY: 宋体">个级别,其中</SPAN><SPAN
lang=EN-US>0</SPAN><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>255</SPAN><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>.bmp</SPAN><SPAN
style="FONT-FAMILY: 宋体">格式的文件中,并没有灰度图这个概念,但是,我们可以很容易在</SPAN><SPAN
lang=EN-US>.bmp</SPAN><SPAN style="FONT-FAMILY: 宋体">文件中表示灰度图。方法是用</SPAN><SPAN
lang=EN-US>256</SPAN><SPAN
style="FONT-FAMILY: 宋体">色的调色板,只不过这个调色板有点特殊,每一项的</SPAN><SPAN
lang=EN-US>RGB</SPAN><SPAN style="FONT-FAMILY: 宋体">值都是相同的。也就是说</SPAN><SPAN
lang=EN-US>RGB</SPAN><SPAN style="FONT-FAMILY: 宋体">值从</SPAN><SPAN
lang=EN-US>(0</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>0)</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>(1</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>1)</SPAN><SPAN style="FONT-FAMILY: 宋体">一直到</SPAN><SPAN
lang=EN-US>(255</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>255</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>255)</SPAN><SPAN style="FONT-FAMILY: 宋体">。</SPAN><SPAN
lang=EN-US>(0</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>0)</SPAN><SPAN style="FONT-FAMILY: 宋体">是全黑色,</SPAN><SPAN
lang=EN-US>(255</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>255</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>255)</SPAN><SPAN
style="FONT-FAMILY: 宋体">是全白色,中间的是灰色。这样,灰度图就可以用</SPAN><SPAN
lang=EN-US>256</SPAN><SPAN
style="FONT-FAMILY: 宋体">色图来表示了。为什么会这样呢?难道是一种巧合?其实并不是。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋体">在表示颜色的方法中,除了</SPAN><SPAN lang=EN-US>RGB</SPAN><SPAN
style="FONT-FAMILY: 宋体">外,还有一种叫</SPAN><SPAN lang=EN-US>YUV</SPAN><SPAN
style="FONT-FAMILY: 宋体">的表示方法,应用也很多。电视信号中用的就是一种类似于</SPAN><SPAN
lang=EN-US>YUV</SPAN><SPAN style="FONT-FAMILY: 宋体">的颜色表示方法。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">在这种表示方法中,</SPAN><SPAN
lang=EN-US>Y</SPAN><SPAN style="FONT-FAMILY: 宋体">分量的物理含义就是亮度,</SPAN><SPAN
lang=EN-US>U</SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN
lang=EN-US>V</SPAN><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></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(1)<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体">因为</SPAN><SPAN lang=EN-US>Y</SPAN><SPAN
style="FONT-FAMILY: 宋体">代表了亮度,所以</SPAN><SPAN lang=EN-US>Y</SPAN><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -