?? 第2章 圖象的幾何變換.htm
字號:
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>RGB</SPAN><SPAN style="FONT-FAMILY: 宋體">表示方法就做不到這一點了。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(2)<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>YUV</SPAN><SPAN
style="FONT-FAMILY: 宋體">信號進行量化時,可以“偏心”一點,讓</SPAN><SPAN lang=EN-US>Y</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>UV</SPAN><SPAN
style="FONT-FAMILY: 宋體">的量化級別少一些,就可以實現圖象信息的壓縮。這一點將在第</SPAN><SPAN
lang=EN-US>9</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>YUV</SPAN><SPAN style="FONT-FAMILY: 宋體">和</SPAN><SPAN
lang=EN-US>RGB</SPAN><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/image014.gif" width=352
v:shapes="_x0000_i1071"> </SUB></SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: right" align=right><SPAN
lang=EN-US>(2.3)</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><SUB><IMG height=75 src="第2章 圖象的幾何變換.files/image016.gif" width=324
v:shapes="_x0000_i1072"> </SUB></SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: right" align=right><SPAN
lang=EN-US>(2.4)</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>a</SPAN><SPAN style="FONT-FAMILY: 宋體">,代入公式</SPAN><SPAN
lang=EN-US>(2.3)</SPAN><SPAN style="FONT-FAMILY: 宋體">,得到</SPAN><SPAN
lang=EN-US>Y=a</SPAN><SPAN style="FONT-FAMILY: 宋體">,</SPAN><SPAN
lang=EN-US>U=0</SPAN><SPAN style="FONT-FAMILY: 宋體">,</SPAN><SPAN lang=EN-US>V=0
</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>RGB</SPAN><SPAN style="FONT-FAMILY: 宋體">值,也就是亮度值;另外,因為是</SPAN><SPAN
lang=EN-US>256</SPAN><SPAN
style="FONT-FAMILY: 宋體">色調色板,所以圖象數據中一個字節代表一個象素,很整齊。如果是</SPAN><SPAN
lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋體">色圖或</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體">色圖,還要拼湊字節,很麻煩。如果是彩色的</SPAN><SPAN
lang=EN-US>256</SPAN><SPAN
style="FONT-FAMILY: 宋體">色圖,由于圖象處理后有可能會產生不屬于這</SPAN><SPAN
lang=EN-US>256</SPAN><SPAN
style="FONT-FAMILY: 宋體">種顏色的新顏色,就更麻煩了;這一點,今后你就會有深刻體會的。所以,做圖象處理時,一般采用灰度圖。為了將重點放在算法本身上,</SPAN><B><SPAN
style="FONT-FAMILY: 黑體">今后給出的程序如不做特殊說明,都是針對<SPAN
lang=EN-US>256級灰度圖的。</SPAN></SPAN></B><SPAN
style="FONT-FAMILY: 宋體">其它顏色的情況,你可以自己想一想,把算法補全。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">如果想得到一幅灰度圖,可以使用</SPAN><SPAN lang=EN-US>Sea</SPAN><SPAN
style="FONT-FAMILY: 宋體">或者</SPAN><SPAN lang=EN-US>PhotoShop</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><SPAN
lang=EN-US>(x<SUB>0</SUB>,y<SUB>0</SUB>) </SPAN><SPAN
style="FONT-FAMILY: 宋體">和右下角點</SPAN><SPAN
lang=EN-US>(x<SUB>1</SUB>,y<SUB>1</SUB>) </SPAN><SPAN
style="FONT-FAMILY: 宋體">,分幾種情況進行處理。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">先看</SPAN><SPAN
lang=EN-US>x</SPAN><SPAN style="FONT-FAMILY: 宋體">方向</SPAN><SPAN
lang=EN-US>(width</SPAN><SPAN style="FONT-FAMILY: 宋體">指圖象的寬度</SPAN><SPAN
lang=EN-US>)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(1)<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US>t<SUB>x</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">≤</SPAN><SPAN
lang=EN-US>-width</SPAN><SPAN
style="FONT-FAMILY: 宋體">:很顯然,圖象完全移出了屏幕,不用做任何處理;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(2)<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US>-width<tx</SPAN><SPAN style="FONT-FAMILY: 宋體">≤</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN style="FONT-FAMILY: 宋體">:如圖</SPAN><SPAN
lang=EN-US>2.5</SPAN><SPAN style="FONT-FAMILY: 宋體">所示。容易看出,圖象區域的</SPAN><SPAN
lang=EN-US>x</SPAN><SPAN style="FONT-FAMILY: 宋體">范圍從</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN style="FONT-FAMILY: 宋體">到</SPAN><SPAN
lang=EN-US>width-|tx|,</SPAN><SPAN style="FONT-FAMILY: 宋體">對應原圖的范圍從</SPAN><SPAN
lang=EN-US>|tx|</SPAN><SPAN style="FONT-FAMILY: 宋體">到</SPAN><SPAN
lang=EN-US>width</SPAN><SPAN style="FONT-FAMILY: 宋體">;</SPAN></P>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=364
src="第2章 圖象的幾何變換.files/image018.jpg" width=397 v:shapes="_x0000_i1026">
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN>2.5 tx</B><B><SPAN
style="FONT-FAMILY: 宋體">≤</SPAN><SPAN lang=EN-US>0</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋體">,</SPAN><SPAN lang=EN-US>ty</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋體">≤</SPAN><SPAN lang=EN-US>0</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋體">的情況</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(3)<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US>0< t<SUB>x</SUB> <width</SPAN><SPAN
style="FONT-FAMILY: 宋體">:如圖</SPAN><SPAN lang=EN-US>2.6</SPAN><SPAN
style="FONT-FAMILY: 宋體">所示。容易看出,圖象區域的</SPAN><SPAN lang=EN-US>x</SPAN><SPAN
style="FONT-FAMILY: 宋體">范圍從</SPAN><SPAN lang=EN-US>t<SUB>x</SUB> </SPAN><SPAN
style="FONT-FAMILY: 宋體">到</SPAN><SPAN lang=EN-US>width</SPAN><SPAN
style="FONT-FAMILY: 宋體">,對應原圖的范圍從</SPAN><SPAN lang=EN-US>0</SPAN><SPAN
style="FONT-FAMILY: 宋體">到</SPAN><SPAN lang=EN-US>width - t<SUB>x
</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">;</SPAN></P>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=342
src="第2章 圖象的幾何變換.files/image020.jpg" width=417 v:shapes="_x0000_i1039">
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN>2.6 0<
tx<width</B><B><SPAN style="FONT-FAMILY: 宋體">,</SPAN><SPAN
lang=EN-US>0<ty<height</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋體">的情況</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(4)<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US>t<SUB>x</SUB> </SPAN><SPAN style="FONT-FAMILY: 宋體">≥</SPAN><SPAN
lang=EN-US>width</SPAN><SPAN
style="FONT-FAMILY: 宋體">:很顯然,圖象完全移出了屏幕,不用做任何處理。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>y</SPAN><SPAN
style="FONT-FAMILY: 宋體">方向是對應的</SPAN><SPAN lang=EN-US>(height</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
lang=EN-US>t<SUB>y</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">≤</SPAN><SPAN
lang=EN-US>-height</SPAN><SPAN
style="FONT-FAMILY: 宋體">,圖象完全移出了屏幕,不用做任何處理;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(2)<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US>-height<t<SUB>y</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">≤</SPAN><SPAN lang=EN-US>0</SPAN><SPAN
style="FONT-FAMILY: 宋體">,圖象區域的</SPAN><SPAN lang=EN-US>y</SPAN><SPAN
style="FONT-FAMILY: 宋體">范圍從</SPAN><SPAN lang=EN-US>0</SPAN><SPAN
style="FONT-FAMILY: 宋體">到</SPAN><SPAN
lang=EN-US>height-|t<SUB>y</SUB>|,</SPAN><SPAN
style="FONT-FAMILY: 宋體">對應原圖的范圍從</SPAN><SPAN
lang=EN-US>|t<SUB>y</SUB>|</SPAN><SPAN style="FONT-FAMILY: 宋體">到</SPAN><SPAN
lang=EN-US>height</SPAN><SPAN style="FONT-FAMILY: 宋體">;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(3)<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US>0<t<SUB>y</SUB><height </SPAN><SPAN
style="FONT-FAMILY: 宋體">,圖象區域的</SPAN><SPAN lang=EN-US>y</SPAN><SPAN
style="FONT-FAMILY: 宋體">范圍從</SPAN><SPAN lang=EN-US>t<SUB>y</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">到</SPAN><SPAN lang=EN-US>height,</SPAN><SPAN
style="FONT-FAMILY: 宋體">對應原圖的范圍從</SPAN><SPAN lang=EN-US>0</SPAN><SPAN
style="FONT-FAMILY: 宋體">到</SPAN><SPAN
lang=EN-US>height-t<SUB>y</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(4)<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US>t<SUB>y</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">≥</SPAN><SPAN
lang=EN-US>height</SPAN><SPAN
style="FONT-FAMILY: 宋體">,圖象完全移出了屏幕,不用做任何處理。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">這種做法利用了位圖存儲的連續性,即同一行的象素在內存中是相鄰的。利用</SPAN><SPAN
lang=EN-US>memcpy</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>(</SPAN><SPAN
style="FONT-FAMILY: 宋體">寬度為</SPAN><SPAN lang=EN-US>x<SUB>1</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">-</SPAN><SPAN lang=EN-US>x<SUB>0</SUB>)</SPAN><SPAN
style="FONT-FAMILY: 宋體">,然后將內存指針移到</SPAN><SPAN
lang=EN-US>(x<SUB>0</SUB>,y<SUB>0</SUB>+1)</SPAN><SPAN
style="FONT-FAMILY: 宋體">處,拷貝下一行。這樣拷貝</SPAN><SPAN
lang=EN-US>(y<SUB>1</SUB>-y<SUB>0</SUB>)</SPAN><SPAN
style="FONT-FAMILY: 宋體">行就完成了全部操作,避免了一個一個象素的計算,提高了效率。</SPAN><SPAN
lang=EN-US>Translation</SPAN><SPAN style="FONT-FAMILY: 宋體">的源代碼如下:</SPAN></P>
<P style="LINE-HEIGHT: 18pt">int xOffset=0,yOffset=0;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>BOOL Translation(HWND
hWnd)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>{</SPAN></P>
<P
style="LINE-HEIGHT: 18pt">DLGPROC
dlgInputBox = NULL;</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>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -