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

📄 第4章 图象的半影调和抖动技术.htm

📁 介绍了图像的半影调和抖动技术的原理和数学基础.
💻 HTM
📖 第 1 页 / 共 5 页
字号:
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: 宋体">。根据这个算法,可以得到</SPAN><SPAN 
lang=EN-US>M<SUB>2</SUB>=<SUB> <IMG height=96 
src="第4章 图象的半影调和抖动技术.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: 宋体">级灰度的标准图案。</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: 宋体">抖动表。</SPAN><SPAN lang=EN-US>M<SUB>4</SUB></SPAN><SPAN 
style="FONT-FAMILY: 宋体">是一个</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: 宋体">根据上面的算法,如果利用</SPAN><SPAN 
lang=EN-US>M<SUB>3</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: 宋体">的图案表示,则一幅</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: 宋体">了。能不能在保持原图大小的情况下利用图案化技术呢?一种很自然的想法是:如果用</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: 宋体">个点中取一点,即重新采样,然后再应用图案化技术,就能够保持原图大小。实际上,这种方法并不可行。首先,你不知道这</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>8</SPAN><SPAN style="FONT-FAMILY: 宋体">×</SPAN><SPAN 
lang=EN-US>8</SPAN><SPAN 
style="FONT-FAMILY: 宋体">的间隔实在太大了,生成的图象和原图肯定相差很大,就象图</SPAN><SPAN 
lang=EN-US>4.1</SPAN><SPAN style="FONT-FAMILY: 宋体">最右边的那幅图一样。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">我们可以采用这样的做法:假设原图是</SPAN><SPAN lang=EN-US>256</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>if (g[y][x]&gt;&gt;2) &gt; bayer[y&amp;7][x&amp;7] then </SPAN><SPAN 
style="FONT-FAMILY: 宋体">打一白点</SPAN><SPAN lang=EN-US> else </SPAN><SPAN 
style="FONT-FAMILY: 宋体">打一黑点</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">其中,</SPAN><SPAN 
lang=EN-US>x,y</SPAN><SPAN style="FONT-FAMILY: 宋体">代表原图的象素坐标,</SPAN><SPAN 
lang=EN-US>g[y][x]</SPAN><SPAN 
style="FONT-FAMILY: 宋体">代表该点灰度。首先将灰度右移两位,变成</SPAN><SPAN 
lang=EN-US>64</SPAN><SPAN style="FONT-FAMILY: 宋体">级,然后将</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: 宋体">运算,找到</SPAN><SPAN 
lang=EN-US>Bayer</SPAN><SPAN 
style="FONT-FAMILY: 宋体">表中的对应点,两者做比较,根据上面给出的判据做处理。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><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: 宋体">×</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>8</SPAN><SPAN style="FONT-FAMILY: 宋体">的</SPAN><SPAN 
lang=EN-US>Bayer</SPAN><SPAN 
style="FONT-FAMILY: 宋体">表相对应。小块中的每个点都参与了比较,这样就避免了上面提到的选点和块划分过大的问题。模</SPAN><SPAN 
lang=EN-US>8</SPAN><SPAN 
style="FONT-FAMILY: 宋体">运算实质上是引入了随机成分,这就是我们下面要讲到的抖动技术。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">图</SPAN><SPAN 
lang=EN-US>4.5</SPAN><SPAN style="FONT-FAMILY: 宋体">就是利用了这个算法,使用</SPAN><SPAN 
lang=EN-US>M<SUB>3</SUB>(Bayer</SPAN><SPAN 
style="FONT-FAMILY: 宋体">抖动表</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章 图象的半影调和抖动技术.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&nbsp;&nbsp;&nbsp;&nbsp; </B><B><SPAN 
style="FONT-FAMILY: 宋体">利用</SPAN><SPAN lang=EN-US>M3</SPAN></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=259 src="第4章 图象的半影调和抖动技术.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&nbsp;&nbsp;&nbsp;&nbsp; </B><B><SPAN 
style="FONT-FAMILY: 宋体">利用</SPAN><SPAN lang=EN-US>M4</SPAN></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>Bayer</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>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: 宋体">位。要注意的是,为了处理的方便,我们的结果图仍采用</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>255</SPAN><SPAN style="FONT-FAMILY: 宋体">两种灰度。</SPAN></P>
<P style="LINE-HEIGHT: 18pt">BYTE BayerPattern[8][8]={&nbsp; 
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>&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; 
</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
12,44,4,36,14,46,6,38,</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
60,28,52,20,62,30,54,22,</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
3,35,11,43,1,33,9,41,</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
51,19,59,27,49,17,57,25,</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
15,47,7,39,13,45,5,37,</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
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&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; 
OffBits,BufSize</P>
<P style="LINE-HEIGHT: 18pt">LPBITMAPINFOHEADER&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; 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; hTempImgData;</P>
<P style="LINE-HEIGHT: 18pt">LPBITMAPINFOHEADER&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; 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; 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; 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; x,y;</P>
<P style="LINE-HEIGHT: 18pt">unsigned 
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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: 宋体">要开的缓冲区大小</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>&nbsp;&nbsp;&nbsp; </SPAN>return FALSE;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt">lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);&nbsp;&nbsp;&nbsp; 

⌨️ 快捷键说明

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