?? 第4章 圖象的半影調(diào)和抖動(dòng)技術(shù).htm
字號(hào):
lang=EN-US>U<SUB>n</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">均為</SPAN><SPAN
lang=EN-US>2<SUP>n</SUP></SPAN><SPAN style="FONT-FAMILY: 宋體">×</SPAN><SPAN
lang=EN-US>2<SUP>n</SUP></SPAN><SPAN style="FONT-FAMILY: 宋體">的方陣,</SPAN><SPAN
lang=EN-US>U<SUB>n</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">的所有元素都是</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋體">。根據(jù)這個(gè)算法,可以得到</SPAN><SPAN
lang=EN-US>M<SUB>2</SUB>=<SUB> <IMG height=96
src="第4章 圖象的半影調(diào)和抖動(dòng)技術(shù).files/image011.gif" width=120 v:shapes="_x0000_i1032">
</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">,為</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN style="FONT-FAMILY: 宋體">級(jí)灰度的標(biāo)準(zhǔn)圖案。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>M<SUB>3</SUB>(8</SPAN><SPAN
style="FONT-FAMILY: 宋體">×</SPAN><SPAN lang=EN-US>8</SPAN><SPAN
style="FONT-FAMILY: 宋體">陣</SPAN><SPAN lang=EN-US>)</SPAN><SPAN
style="FONT-FAMILY: 宋體">比較特殊,稱為</SPAN><SPAN lang=EN-US>Bayer</SPAN><SPAN
style="FONT-FAMILY: 宋體">抖動(dòng)表。</SPAN><SPAN lang=EN-US>M<SUB>4</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">是一個(gè)</SPAN><SPAN lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體">×</SPAN><SPAN lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體">的矩陣。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">根據(jù)上面的算法,如果利用</SPAN><SPAN
lang=EN-US>M<SUB>3</SUB></SPAN><SPAN style="FONT-FAMILY: 宋體">一個(gè)象素要用</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">×</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">的圖案表示,則一幅</SPAN><SPAN
lang=EN-US>N</SPAN><SPAN style="FONT-FAMILY: 宋體">×</SPAN><SPAN
lang=EN-US>N</SPAN><SPAN style="FONT-FAMILY: 宋體">的圖將變成</SPAN><SPAN
lang=EN-US>8N</SPAN><SPAN style="FONT-FAMILY: 宋體">×</SPAN><SPAN
lang=EN-US>8N</SPAN><SPAN style="FONT-FAMILY: 宋體">大小。如果利用</SPAN><SPAN
lang=EN-US>M<SUB>4</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">,就更不得了,變成</SPAN><SPAN lang=EN-US>16N</SPAN><SPAN
style="FONT-FAMILY: 宋體">×</SPAN><SPAN lang=EN-US>16N</SPAN><SPAN
style="FONT-FAMILY: 宋體">了。能不能在保持原圖大小的情況下利用圖案化技術(shù)呢?一種很自然的想法是:如果用</SPAN><SPAN
lang=EN-US>M<SUB>2</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">陣,則將原圖中每</SPAN><SPAN lang=EN-US>8</SPAN><SPAN
style="FONT-FAMILY: 宋體">×</SPAN><SPAN lang=EN-US>8</SPAN><SPAN
style="FONT-FAMILY: 宋體">個(gè)點(diǎn)中取一點(diǎn),即重新采樣,然后再應(yīng)用圖案化技術(shù),就能夠保持原圖大小。實(shí)際上,這種方法并不可行。首先,你不知道這</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">×</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">個(gè)點(diǎn)中找哪一點(diǎn)比較合適,另外,</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">×</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN
style="FONT-FAMILY: 宋體">的間隔實(shí)在太大了,生成的圖象和原圖肯定相差很大,就象圖</SPAN><SPAN
lang=EN-US>4.1</SPAN><SPAN style="FONT-FAMILY: 宋體">最右邊的那幅圖一樣。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">我們可以采用這樣的做法:假設(shè)原圖是</SPAN><SPAN lang=EN-US>256</SPAN><SPAN
style="FONT-FAMILY: 宋體">級(jí)灰度,利用</SPAN><SPAN lang=EN-US>Bayer</SPAN><SPAN
style="FONT-FAMILY: 宋體">抖動(dòng)表,做如下處理</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US>if (g[y][x]>>2) > bayer[y&7][x&7] then </SPAN><SPAN
style="FONT-FAMILY: 宋體">打一白點(diǎn)</SPAN><SPAN lang=EN-US> else </SPAN><SPAN
style="FONT-FAMILY: 宋體">打一黑點(diǎn)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">其中,</SPAN><SPAN
lang=EN-US>x,y</SPAN><SPAN style="FONT-FAMILY: 宋體">代表原圖的象素坐標(biāo),</SPAN><SPAN
lang=EN-US>g[y][x]</SPAN><SPAN
style="FONT-FAMILY: 宋體">代表該點(diǎn)灰度。首先將灰度右移兩位,變成</SPAN><SPAN
lang=EN-US>64</SPAN><SPAN style="FONT-FAMILY: 宋體">級(jí),然后將</SPAN><SPAN
lang=EN-US>x</SPAN><SPAN style="FONT-FAMILY: 宋體">,</SPAN><SPAN
lang=EN-US>y</SPAN><SPAN style="FONT-FAMILY: 宋體">做模</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">運(yùn)算,找到</SPAN><SPAN
lang=EN-US>Bayer</SPAN><SPAN
style="FONT-FAMILY: 宋體">表中的對(duì)應(yīng)點(diǎn),兩者做比較,根據(jù)上面給出的判據(jù)做處理。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">我們可以看到,模</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">運(yùn)算使得原圖分成了一個(gè)個(gè)</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">×</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">的小塊,每個(gè)小塊和</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">×</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋體">的</SPAN><SPAN
lang=EN-US>Bayer</SPAN><SPAN
style="FONT-FAMILY: 宋體">表相對(duì)應(yīng)。小塊中的每個(gè)點(diǎn)都參與了比較,這樣就避免了上面提到的選點(diǎn)和塊劃分過(guò)大的問題。模</SPAN><SPAN
lang=EN-US>8</SPAN><SPAN
style="FONT-FAMILY: 宋體">運(yùn)算實(shí)質(zhì)上是引入了隨機(jī)成分,這就是我們下面要講到的抖動(dòng)技術(shù)。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋體">圖</SPAN><SPAN
lang=EN-US>4.5</SPAN><SPAN style="FONT-FAMILY: 宋體">就是利用了這個(gè)算法,使用</SPAN><SPAN
lang=EN-US>M<SUB>3</SUB>(Bayer</SPAN><SPAN
style="FONT-FAMILY: 宋體">抖動(dòng)表</SPAN><SPAN lang=EN-US>)</SPAN><SPAN
style="FONT-FAMILY: 宋體">陣得到的;圖</SPAN><SPAN lang=EN-US>6</SPAN><SPAN
style="FONT-FAMILY: 宋體">是使用</SPAN><SPAN lang=EN-US>M<SUB>4</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">陣得到的,可見兩者的差別并不是很大,所以一般用</SPAN><SPAN
lang=EN-US>Bayer</SPAN><SPAN style="FONT-FAMILY: 宋體">表就可以了。</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><IMG height=259 src="第4章 圖象的半影調(diào)和抖動(dòng)技術(shù).files/image012.gif" width=409
v:shapes="_x0000_i1033"> </SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN>4.5 </B><B><SPAN
style="FONT-FAMILY: 宋體">利用</SPAN><SPAN lang=EN-US>M3</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋體">抖動(dòng)生成的圖</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=259 src="第4章 圖象的半影調(diào)和抖動(dòng)技術(shù).files/image013.gif" width=409
v:shapes="_x0000_i1034"> </SPAN></B></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋體">圖</SPAN>4.6 </B><B><SPAN
style="FONT-FAMILY: 宋體">利用</SPAN><SPAN lang=EN-US>M4</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋體">抖動(dòng)生成的圖</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
style="FONT-FAMILY: 宋體">下面是算法的源程序,是針對(duì)</SPAN><SPAN lang=EN-US>Bayer</SPAN><SPAN
style="FONT-FAMILY: 宋體">表的。因?yàn)樗莻€(gè)常用的表,我們不再利用</SPAN><SPAN
lang=EN-US>Limb</SPAN><SPAN style="FONT-FAMILY: 宋體">公式,而是直接給出。針對(duì)</SPAN><SPAN
lang=EN-US>M<SUB>4</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">陣的算法是類似的,不同的地方在于,要用</SPAN><SPAN
lang=EN-US>Limb</SPAN><SPAN style="FONT-FAMILY: 宋體">公式得到</SPAN><SPAN
lang=EN-US>M<SUB>4</SUB></SPAN><SPAN
style="FONT-FAMILY: 宋體">陣,灰度也不用右移</SPAN><SPAN lang=EN-US>2</SPAN><SPAN
style="FONT-FAMILY: 宋體">位。要注意的是,為了處理的方便,我們的結(jié)果圖仍采用</SPAN><SPAN
lang=EN-US>256</SPAN><SPAN style="FONT-FAMILY: 宋體">級(jí)灰度圖,不過(guò)只用到了</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN style="FONT-FAMILY: 宋體">和</SPAN><SPAN
lang=EN-US>255</SPAN><SPAN style="FONT-FAMILY: 宋體">兩種灰度。</SPAN></P>
<P style="LINE-HEIGHT: 18pt">BYTE BayerPattern[8][8]={
0,32,8,40,2,34,10,42,</P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>48,16,56,24,50,18,58,26,</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>
12,44,4,36,14,46,6,38,</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>
60,28,52,20,62,30,54,22,</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>
3,35,11,43,1,33,9,41,</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>
51,19,59,27,49,17,57,25,</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>
15,47,7,39,13,45,5,37,</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>
63,31,55,23,61,29,53,21};</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>BOOL LimbPatternM3(HWND
hWnd)</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">unsigned
char
num;</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: 宋體">要開的緩沖區(qū)大小</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> </SPAN>return FALSE;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P
style="LINE-HEIGHT: 18pt">lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -