版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)</p><p> 課題名稱 : 基本圖像處理功能軟件包的設(shè)計(jì)</p><p> 專業(yè): 信息與計(jì)算科學(xué) </p><p> 姓名: </p><p> 時(shí)間: 2012年6月20日
2、 </p><p><b> 目 錄</b></p><p><b> 一、理論背景3</b></p><p><b> 二、課題目的3</b></p><p> 三、系統(tǒng)開發(fā)環(huán)境3</p><p> 四、經(jīng)典邊緣檢測算法分析4&l
3、t;/p><p> 1、Roberts算子4</p><p> 2、Krisch邊緣檢測算子5</p><p> 3、 Sobel邊緣算子和Prewitt邊緣算子6</p><p> 五、圖像處理幾何變換算法分析7</p><p> 1、矩形圖像變?nèi)切?</p><p> 2
4、、矩形圖像變菱形8</p><p> 3、矩形變?yōu)閳A及半圓9</p><p><b> 4、擴(kuò)散效果10</b></p><p><b> 六、總結(jié)10</b></p><p><b> 七、參考文獻(xiàn)10</b></p><p> 八
5、、代碼附錄:11</p><p> 1、Robert算子11</p><p> 2、Kirsch 算子11</p><p> 3、GaussLaplace算子14</p><p> 4、矩形變?nèi)切?5</p><p><b> 5、矩形變圓15</b></p>
6、<p> 6、矩形變菱形16</p><p><b> 7、灰度化17</b></p><p><b> 8、反色17</b></p><p> 9、二值化腐蝕18</p><p> 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告</p><p><b>
7、 一、理論背景</b></p><p> 圖像處理就是對圖像信息加工以滿足人的視覺心理或應(yīng)用需求的方法。圖像處理方法有光學(xué)方法和電子學(xué)方法。從20世紀(jì)60年代起隨著電子計(jì)算機(jī)和計(jì)算技術(shù)的不斷提高和普及,數(shù)字圖像處理進(jìn)入了高速發(fā)展時(shí)期,而數(shù)字圖像處理就是利用數(shù)字計(jì)算機(jī)或其它的硬件設(shè)備對圖像信息轉(zhuǎn)換而得到的電信號進(jìn)行某些數(shù)學(xué)處理以提高圖像的實(shí)用性。</p><p> 圖像處理在
8、遙感技術(shù),醫(yī)學(xué)領(lǐng)域,安全領(lǐng)域,工業(yè)生產(chǎn)中有著廣泛的應(yīng)用,其中在醫(yī)學(xué)應(yīng)用中的超聲、核磁共振和CT等技術(shù),安全領(lǐng)域的模式識(shí)別技術(shù),工業(yè)中的無損檢測技術(shù)尤其引人注目。</p><p> 計(jì)算機(jī)進(jìn)行圖像處理一般有兩個(gè)目的:(1)產(chǎn)生更適合人觀察和識(shí)別的圖像。(2)希望能由計(jì)算機(jī)自動(dòng)識(shí)別和理解圖像。數(shù)字圖像的邊緣檢測是圖像分割、目標(biāo)區(qū)域的識(shí)別、區(qū)域形狀提取等圖像分析領(lǐng)域的重要基礎(chǔ),圖像處理和分析的第一步往往就是邊緣檢測。
9、</p><p> 物體的邊緣是以圖像的局部特征不連續(xù)的形式出現(xiàn)的,也就是指圖像局部亮度變化最顯著的部分,例如灰度值的突變、顏色的突變、紋理結(jié)構(gòu)的突變等,同時(shí)物體的邊緣也是不同區(qū)域的分界處。圖像邊緣有方向和幅度兩個(gè)特性,通常沿邊緣的走向灰度變化平緩,垂直于邊緣走向的像素灰度變化劇烈。根據(jù)灰度變化的特點(diǎn),圖像邊緣可分為階躍型、房頂型和凸緣型。</p><p><b> 二、課題
10、目的</b></p><p> 本課題的目的是從理論上對幾種經(jīng)典的邊緣檢測算法(Roberts算子、Sobel算子、Prewitt算子、Krisch算子、高斯-拉普拉斯算子)進(jìn)行分析,并用Delphi實(shí)現(xiàn)這些算法。最后,通過實(shí)例圖像對不同邊緣檢測算法的效果進(jìn)行分析,找出各種算法的適用范圍。通過本課題的研究可以為以后進(jìn)一步學(xué)習(xí)數(shù)字圖像處理打好基礎(chǔ),提高學(xué)生的獨(dú)立工作能力和編程能力。</p>
11、<p><b> 三、系統(tǒng)開發(fā)環(huán)境</b></p><p> 開發(fā)工具:delphi7</p><p> 操作系統(tǒng):Microsoft Windows 7</p><p><b> 主界面:</b></p><p> 四、經(jīng)典邊緣檢測算法分析</p><p
12、> 1、Roberts算子</p><p> 邊緣,是指周圍像素灰度有階躍變化或屋頂?shù)茸兓哪切┫袼氐募?。圖像的邊緣對應(yīng)著圖像灰度的不連續(xù)性。顯然圖像的邊緣很少是從一個(gè)灰度跳到另一個(gè)灰度這樣的理想狀況。真實(shí)圖像的邊緣通常都具有有限的寬度呈現(xiàn)出陡峭的斜坡狀。 </p><p> 邊緣的銳利程度由圖像灰度的梯度決定。梯度是一個(gè)向量,?f指出灰度變化最快的方向和變化量。</p
13、><p><b> (1)</b></p><p><b> 梯度大小由</b></p><p><b> (2)</b></p><p> 確定。而梯度方向則由</p><p><b> (3)</b></p>
14、<p><b> 確定。</b></p><p> 因此最簡單的邊緣檢測算子是用圖像的垂直和水平差分來逼近梯度算子: </p><p><b> (4)</b></p><p> 因此當(dāng)我們尋找邊緣的時(shí)候,最簡單的方法是對每一個(gè)像素計(jì)算出(4)的向量,然后求出它的絕對值。利用這種思想就得到了Robert
15、s算子:</p><p><b> (5)</b></p><p> 其中f(x,y)是具有整數(shù)像素坐標(biāo)的輸入圖像。</p><p> 處理前 處理后(Roberts算子)</p><p> 2、Krisch邊緣檢測算子</p><
16、p> 根據(jù)前面對該算法的分析得到的方法在具體實(shí)現(xiàn)中我使用了Kirsch (LPSTR lpDIBBits, LONG lWidth, LONG lHeight)函數(shù)。算法實(shí)現(xiàn)分為以下幾步:</p><p> ?。?)(a)設(shè)置一個(gè)一維數(shù)組來保存第一個(gè)模板的模板參數(shù),進(jìn)行第一次模板操作并把得到的圖像存在緩存1中。(b)重新設(shè)置模板參數(shù),進(jìn)行模板操作并把得到的圖像存在緩存3中。</p><
17、p> ?。?)求兩副緩存圖像的最大值:</p><p> (a)指向緩存圖像1倒數(shù)第j行,第i個(gè)像素的指針</p><p> lpDst1 = (char *)lpNewDIBBits1 + lWidth * j + i;</p><p> (b)指向緩存圖像2倒數(shù)第j行,第i個(gè)像素的指針</p><p> lpDst2
18、= (char *)lpNewDIBBits2 + lWidth * j + i;</p><p><b> (c)比較得到結(jié)果</b></p><p> if(*lpDst2 > *lpDst1)</p><p> *lpDst1 = *lpDst2;</p><p> ?。?)使用冒泡算法的思想其它的各個(gè)
19、模板重復(fù)一、二的操作進(jìn)行比較得到該像素點(diǎn)處理后的最大值為該點(diǎn)的輸出值。</p><p> ?。?)比較整幅圖像的所有像素點(diǎn)。</p><p> 處理前 處理后(Krisch算子)</p><p> 3、 Sobel邊緣算子和Prewitt邊緣算子</p><p> Rober
20、ts算子是直觀的也是簡單的,但是對噪聲多的情況顯然效果不好。實(shí)踐中人們做了大量的實(shí)踐,總結(jié)出了一些經(jīng)驗(yàn)。 Prewitt和Sobel分別提出了一個(gè)算子,這就是Prewitt算子和Sobel算子。 Prewitt邊緣檢測算子使用兩個(gè)有向算子(一個(gè)水平的,一個(gè)是垂直的,一般稱為模板),每一個(gè)逼近一個(gè)偏導(dǎo)數(shù): </p><p> ?。≒rewitt模板)</p><p> 如果我們用Prewi
21、tt算子檢測圖像 M 的邊緣的話,我們可以先分別用水平算子和垂直算子對圖像進(jìn)行卷積,得到的是兩個(gè)矩陣,在不考慮邊界的情形下也是和原圖像同樣大小的 M1,M2,他們分別表示圖像M中相同位置處的兩個(gè)偏導(dǎo)數(shù)。然后把M1,M2 對應(yīng)位置的兩個(gè)數(shù)平方后相加得到一個(gè)新的矩陣G,G表示M中各個(gè)像素的灰度的梯度值(一個(gè)逼近)。然后就可以通過閥值處理得到邊緣圖像。</p><p> Sobel算子和Prewitt算子的不同就在于
22、使用的模板不一樣:</p><p><b> ?。⊿obel模板)</b></p><p> 這些模板是怎么來的呢? </p><p> 我們假設(shè)圖像的灰度滿足下面這個(gè)關(guān)系: </p><p><b> (1)</b></p><p> 則梯度是(,) 。 </
23、p><p> 顯然,當(dāng)前像素 3×3 鄰域內(nèi)像素值為:</p><p><b> (2)</b></p><p> 定義垂直算子和水平算子形如: </p><p><b> (3)</b></p><p> 利用這兩個(gè)模板對當(dāng)前像素進(jìn)行卷積,得到的方向?qū)?shù)為
24、:</p><p><b> (4)</b></p><p> 因此當(dāng)前像素處的梯度的大小為 :</p><p><b> (5)</b></p><p><b> 顯然要有: </b></p><p> 2(2a+b)=1
25、 (6) </p><p> 如果我們?nèi)?a=b=1/6則得到的模板就是1/6乘Prewitt算子; </p><p> 如果我們?nèi)=1/8,b=1/4則得到的就是1/8乘Sobel算子。 </p><p> 處理前 處理后(sobel算子)</p>
26、;<p> 五、圖像處理幾何變換算法分析</p><p> 1、矩形圖像變?nèi)切?lt;/p><p><b> 如下圖所示:</b></p><p> 在這里,我是令矩形的高與三角形的高相等,矩形的寬與三角形的底邊長相等。三角形是以它底邊中點(diǎn)為坐標(biāo)原點(diǎn),以底邊為X軸,方向向右,三角的高為Y軸,方向向上,建立坐標(biāo)系。矩形是以它的
27、左上角為坐標(biāo)原點(diǎn),以寬為X軸,方向向右,以高為Y軸,方向向下。從坐標(biāo)原點(diǎn)對矩形進(jìn)行一行一行的掃描,并且同時(shí)一行一行的移動(dòng)給三角形,上圖只畫了兩條掃描線以表示意。二者坐標(biāo)變換關(guān)系如下:</p><p> X=cos(i*pi/h)*j*w/(2h);</p><p><b> Y=j;</b></p><p> X,Y是三角形的坐標(biāo),i,j
28、是矩形的坐標(biāo),w,h分別為矩形的寬與高。其它三種三角形類似分析,具體代碼參見附錄。</p><p> 矩形(前) 三角形(后)</p><p><b> 2、矩形圖像變菱形</b></p><p><b> 如下圖所示:</b></p>&
29、lt;p> 矩形(前) 菱形(后)</p><p> 其實(shí)它的原理以矩形變?nèi)切蔚牟畈欢?。矩形坐?biāo)同上,菱形坐標(biāo)是以它的中心為坐標(biāo)原點(diǎn),以左右對角線為X軸,方向向右,以上下對角線為Y軸,方向向上。掃描線方法同上,如上圖所示的兩條掃描線。二者坐標(biāo)變換關(guān)系為:</p><p><b> If j<
30、;h/2</b></p><p> X=-cos(i*pi/h)*j*w/(h);</p><p><b> If j>h/2</b></p><p> X=-cos(i*pi/h)*(h-j)*w/(2h);</p><p><b> Y=j;</b></p>
31、;<p> X,Y為菱形坐標(biāo),其余參數(shù)表示同上。具體代碼參見附錄。</p><p> 3、矩形變?yōu)閳A及半圓</p><p><b> 如下圖所示</b></p><p> 矩形(前) 圓(后)</p><p> 這里以圓的直徑為矩形的寬
32、為例說明。矩形坐標(biāo)同上,圓的坐標(biāo)是圓心為坐標(biāo)原點(diǎn),以水平直徑為X軸,方向向右。以垂直直徑為Y軸,方向向上。掃描線如上圖所示。二者坐標(biāo)變換關(guān)系為:</p><p><b> r=w/2</b></p><p> X=cos(i*pi/w)*(-r)</p><p> Y=cos(j*pi/h)* (-sqrt(r*r-xx*xx))<
33、/p><p> X,Y為圓的坐標(biāo),其余參數(shù)同上。</p><p> 半圓的坐標(biāo)變換差不多,只是在把Y變?yōu)閅= cos(j*pi/2h)* (-sqrt(r*r-xx*xx))即可,X變換與圓一樣。具體代碼參見附錄。</p><p><b> 4、擴(kuò)散效果</b></p><p> 擴(kuò)散的原理:由于不在邊緣的像素點(diǎn)周圍
34、都有8個(gè)像素點(diǎn),加上自己共9個(gè)像素點(diǎn),采用隨機(jī)數(shù)產(chǎn)生1-9之間的數(shù),若為1-8就把該像素點(diǎn)代替自己,若為9就不做處理。</p><p><b> 六、總結(jié)</b></p><p> 本課題從理論上對幾種經(jīng)典的邊緣檢測算法(Roberts算子、Sobel算子、Prewitt算子、Krisch算子、高斯-拉普拉斯算子)以及幾何圖形變換的算法(矩形變?nèi)切巍⒕匦巫兞庑巍?/p>
35、矩形變圓、矩形變半圓等)進(jìn)行分析,并用Delphi實(shí)現(xiàn)這些算法。最后,通過實(shí)例圖像對不同邊緣檢測算法的效果進(jìn)行分析,找出各種算法的適用范圍。通過本課題的研究拓寬了自己的知識(shí)面,為以后進(jìn)一步學(xué)習(xí)數(shù)字圖像處理打下了基礎(chǔ),提高了學(xué)生的獨(dú)立工作能力和編程能力。</p><p><b> 七、參考文獻(xiàn)</b></p><p> [1].王愛民,趙忠旭,沈蘭芬. 基于矢量Pr
36、ewitt算子的多尺度彩色圖像邊緣檢測方法.</p><p> 中國圖像圖形學(xué)報(bào). 第4卷(A版),第12期1999年12月</p><p> [2].呂俊白. 基于快速Kirsch與邊緣點(diǎn)概率分析的邊緣提取. 計(jì)算機(jī)應(yīng)用. 第21卷2001年2月</p><p> [3].呂俊白. 基于Laplacian算子的一種新的邊緣檢測方法. 小型微型計(jì)算機(jī)系統(tǒng). 第
37、23卷,第9期2002年9月</p><p> [4].王卜堂,楊善林. 基于Gauss—Laplace算子的灰度圖像邊緣檢測 </p><p> 計(jì)算機(jī)工程與應(yīng)用. 2003年2月</p><p><b> 八、代碼附錄:</b></p><p> 1、Robert算子</p><p>
38、 procedure TImageProcessForm.RobertClick(Sender: TObject);</p><p> var//Robert邊緣檢測程序</p><p> x,y:integer;</p><p> P,p1,p2:pbytearray;</p><p><b> begin</b&
39、gt;</p><p> TestBMP.Assign(WillbeChangedBmp);</p><p> ProcessedBmp.Assign(WillbeChangedBmp);</p><p> for y:=0 to TestBMP.Height-2 do</p><p><b> begin</b>
40、;</p><p> p:=ProcessedBmp.ScanLine[y];</p><p> p1:=TestBMP.ScanLine[y];</p><p> p2:=TestBMP.ScanLine[y+1];</p><p> for x:=0 to TestBMP.Width-2 do</p><p&g
41、t;<b> begin</b></p><p> p[3*x]:=max(0,max(-p1[3*(x+1)]+p2[3*x], p1[3*x]-p2[3*(x+1)]));</p><p> p[3*x+1]:=max(0,max(-p1[3*(x+1)+1]+p2[3*x+1], p1[3*x+1]-p2[3*(x+1)+1]));</p>
42、<p> p[3*x+2]:=max(0,max(-p1[3*(x+1)+2]+p2[3*x+2], p1[3*x+2]-p2[3*(x+1)+2]));</p><p><b> end;</b></p><p><b> end;</b></p><p> ChangedBmp.Assign(Proc
43、essedBmp);</p><p> ShowChangedBmp;</p><p><b> end;</b></p><p> 2、Kirsch 算子</p><p> procedure TImageProcessForm.KirschClick(Sender: TObject);</p>
44、<p> var pu,pm,pd ,p1,p2,p3,p4,p5,p6,p7,p8,p:pbytearray;</p><p> x,y:integer;</p><p><b> begin</b></p><p> TestBMP.Assign(WillbeChangedBmp);</p><p>
45、; ProcessedBmp.Assign(WillbeChangedBmp);</p><p> for y:=1 to TestBMP.Height-2 do</p><p><b> begin</b></p><p> p:= ProcessedBmp.ScanLine[y];</p><p> p1:
46、= ProcessedBmp.ScanLine[y];</p><p> p2:= ProcessedBmp.ScanLine[y];</p><p> p3:= ProcessedBmp.ScanLine[y];</p><p> p4:= ProcessedBmp.ScanLine[y];</p><p> p5:= Proces
47、sedBmp.ScanLine[y];</p><p> p6:= ProcessedBmp.ScanLine[y];</p><p> p7:= ProcessedBmp.ScanLine[y];</p><p> p8:= ProcessedBmp.ScanLine[y];</p><p> pu:=TestBMP.ScanLin
48、e[y-1];</p><p> pm:=TestBMP.ScanLine[y];</p><p> pd:=TestBMP.ScanLine[y+1];</p><p> for x:=1 to TestBMP.Width-2 do</p><p> begin // 1 方向最大值</p><p>
49、 p1[x*3]:=min(255,max(0,(5*pu[3*(x-1)]+5*pu[3*x]+5*pu[3*(x+1)]</p><p> -3*pm[3*(x-1)]-3*pm[3*(x+1)]</p><p> -3*pd[3*(x-1)]-3*pu[3*x]-3*pd[3*(x+1)])));</p><p> p1[x*3+1]:=min(255,
50、max(0,(5*pu[3*(x-1)+1]+5*pu[3*x+1]+5*pu[3*(x+1)+1]</p><p> -3*pm[3*(x-1)+1]-3*pm[3*(x+1)+1]</p><p> -3*pd[3*(x-1)+1]-3*pu[3*x]-3*pd[3*(x+1)]+1)));</p><p> p1[x*3+2]:=min(255,max(
51、0,(5*pu[3*(x-1)+2]+5*pu[3*x+2]+5*pu[3*(x+1)+2]</p><p> -3*pm[3*(x-1)+2]-3*pm[3*(x+1)+2]</p><p> -3*pd[3*(x-1)+2]-3*pu[3*x]-3*pd[3*(x+1)+2])));</p><p> // 2 方向最大值</p><
52、;p> p1[x*3]:=min(255,max(0,(-3*pu[3*(x-1)]+5*pu[3*x]+5*pu[3*(x+1)]</p><p> -3*pm[3*(x-1)]+5*pm[3*(x+1)]</p><p> -3*pd[3*(x-1)]-3*pu[3*x]-3*pd[3*(x+1)])));</p><p> p1[x*3+1]:=
53、min(255,max(0,(-3*pu[3*(x-1)+1]+5*pu[3*x+1]+5*pu[3*(x+1)+1]</p><p> -3*pm[3*(x-1)+1]+5*pm[3*(x+1)+1]</p><p> -3*pd[3*(x-1)+1]-3*pu[3*x]-3*pd[3*(x+1)]+1)));</p><p> p1[x*3+2]:=min
54、(255,max(0,(-3*pu[3*(x-1)+2]+5*pu[3*x+2]+5*pu[3*(x+1)+2]</p><p> -3*pm[3*(x-1)+2]+5*pm[3*(x+1)+2]</p><p> -3*pd[3*(x-1)+2]-3*pu[3*x]-3*pd[3*(x+1)+2])));</p><p> // 3 方向最大值</
55、p><p> p1[x*3]:=min(255,max(0,(-3*pu[3*(x-1)]-3*pu[3*x]+5*pu[3*(x+1)]</p><p> -3*pm[3*(x-1)]+5*pm[3*(x+1)]</p><p> -3*pd[3*(x-1)]-3*pu[3*x]+5*pd[3*(x+1)])));</p><p> p
56、1[x*3+1]:=min(255,max(0,(-3*pu[3*(x-1)+1]-3*pu[3*x+1]+5*pu[3*(x+1)+1]</p><p> -3*pm[3*(x-1)+1]+5*pm[3*(x+1)+1]</p><p> -3*pd[3*(x-1)+1]-3*pu[3*x]+5*pd[3*(x+1)]+1)));</p><p> p1[x
57、*3+2]:=min(255,max(0,(-3*pu[3*(x-1)+2]-3*pu[3*x+2]+5*pu[3*(x+1)+2]</p><p> -3*pm[3*(x-1)+2]+5*pm[3*(x+1)+2]</p><p> -3*pd[3*(x-1)+2]-3*pu[3*x]+5*pd[3*(x+1)+2])));</p><p> // 4 方
58、向最大值</p><p> p1[x*3]:=min(255,max(0,(-pu[3*(x-1)]-pu[3*x]-pu[3*(x+1)]</p><p> +pd[3*(x-1)]+pu[3*x]+pd[3*(x+1)])));</p><p> p1[x*3+1]:=min(255,max(0,(-pu[3*(x-1)+1]-pu[3*x+1]-pu[3
59、*(x+1)+1]</p><p> +pd[3*(x-1)+1]+pu[3*x]+pd[3*(x+1)]+1)));</p><p> p1[x*3+2]:=min(255,max(0,(-pu[3*(x-1)+2]-pu[3*x+2]-pu[3*(x+1)+2]</p><p> +pd[3*(x-1)+2]+pu[3*x]+pd[3*(x+1)+2]))
60、);</p><p> // 5 方向最大值</p><p> p1[x*3]:=min(255,max(0,(-3*pu[3*(x-1)]-3*pu[3*x]-3*pu[3*(x+1)]</p><p> -3*pm[3*(x-1)]-3*pm[3*(x+1)]</p><p> +5*pd[3*(x-1)]+5*pu[3*x]+
61、5*pd[3*(x+1)])));</p><p> p1[x*3+1]:=min(255,max(0,(-3*pu[3*(x-1)+1]-3*pu[3*x+1]-3*pu[3*(x+1)+1]</p><p> -3*pm[3*(x-1)+1]-3*pm[3*(x+1)+1]</p><p> +5*pd[3*(x-1)+1]+5*pu[3*x]+5*pd[
62、3*(x+1)]+1)));</p><p> p1[x*3+2]:=min(255,max(0,(-3*pu[3*(x-1)+2]-3*pu[3*x+2]-3*pu[3*(x+1)+2]</p><p> -3*pm[3*(x-1)+2]-3*pm[3*(x+1)+2]</p><p> +5*pd[3*(x-1)+2]+5*pu[3*x]+5*pd[3*(
63、x+1)+2])));</p><p><b> //6 方向最大值</b></p><p> p1[x*3]:=min(255,max(0,(-3*pu[3*(x-1)]-3*pu[3*x]-3*pu[3*(x+1)]</p><p> +5*pm[3*(x-1)]-3*pm[3*(x+1)]</p><p>
64、 +5*pd[3*(x-1)]+5*pu[3*x]-3*pd[3*(x+1)])));</p><p> p1[x*3+1]:=min(255,max(0,(-3*pu[3*(x-1)+1]-3*pu[3*x+1]-3*pu[3*(x+1)+1]</p><p> +5*pm[3*(x-1)+1]-3*pm[3*(x+1)+1]</p><p> +5*pd[
65、3*(x-1)+1]+5*pu[3*x]-3*pd[3*(x+1)]+1)));</p><p> p1[x*3+2]:=min(255,max(0,(-3*pu[3*(x-1)+2]-3*pu[3*x+2]-3*pu[3*(x+1)+2]</p><p> +5*pm[3*(x-1)+2]-3*pm[3*(x+1)+2]</p><p> +5*pd[3*(
66、x-1)+2]+5*pu[3*x]-3*pd[3*(x+1)+2])));</p><p><b> // 7方向最大值</b></p><p> p1[x*3]:=min(255,max(0,(5*pu[3*(x-1)]-3*pu[3*x]-3*pu[3*(x+1)]</p><p> +5*pm[3*(x-1)]-3*pm[3*(x+
67、1)]</p><p> +5*pd[3*(x-1)]-3*pu[3*x]-3*pd[3*(x+1)])));</p><p> p1[x*3+1]:=min(255,max(0,(5*pu[3*(x-1)+1]-3*pu[3*x+1]-3*pu[3*(x+1)+1]</p><p> +5*pm[3*(x-1)+1]-3*pm[3*(x+1)+1]</
68、p><p> +5*pd[3*(x-1)+1]-3*pu[3*x]-3*pd[3*(x+1)]+1)));</p><p> p1[x*3+2]:=min(255,max(0,(5*pu[3*(x-1)+2]-3*pu[3*x+2]-3*pu[3*(x+1)+2]</p><p> +5*pm[3*(x-1)+2]-3*pm[3*(x+1)+2]</p>
69、;<p> +5*pd[3*(x-1)+2]-3*pu[3*x]-3*pd[3*(x+1)+2])));</p><p><b> // 8方向最大值</b></p><p> p1[x*3]:=min(255,max(0,(5*pu[3*(x-1)]+5*pu[3*x]-3*pu[3*(x+1)]</p><p> +5
70、*pm[3*(x-1)]-3*pm[3*(x+1)]</p><p> -3*pd[3*(x-1)]-3*pu[3*x]-3*pd[3*(x+1)])));</p><p> p1[x*3+1]:=min(255,max(0,(5*pu[3*(x-1)+1]+5*pu[3*x+1]-3*pu[3*(x+1)+1]</p><p> +5*pm[3*(x-1)+
71、1]-3*pm[3*(x+1)+1]</p><p> -3*pd[3*(x-1)+1]-3*pu[3*x]-3*pd[3*(x+1)]+1)));</p><p> p1[x*3+2]:=min(255,max(0,(5*pu[3*(x-1)+2]+5*pu[3*x+2]-3*pu[3*(x+1)+2]</p><p> +5*pm[3*(x-1)+2]-3
72、*pm[3*(x+1)+2]</p><p> -3*pd[3*(x-1)+2]-3*pu[3*x]-3*pd[3*(x+1)+2])));</p><p> p[x*3]:=max(max(max(max(max(max(max(p1[3*x],p2[3*x]),p3[3*x]),p4[3*x]),p5[3*x]),p6[3*x]),p7[3*x]),p8[3*x]);</p&
73、gt;<p> p[x*3+1]:=max(max(max(max(max(max(max(p1[3*x+1],p2[3*x+1]),p3[3*x+1]),p4[3*x+1]),p5[3*x+1]),p6[3*x+1]),p7[3*x+1]),p8[3*x+1]);</p><p> p[x*3+2]:=max(max(max(max(max(max(max(p1[3*x+2],p2[3*x+2
74、]),p3[3*x+2]),p4[3*x+2]),p5[3*x+2]),p6[3*x+2]),p7[3*x+2]),p8[3*x+2]);</p><p><b> end;</b></p><p><b> end;</b></p><p> ChangedBmp.Assign(ProcessedBmp);<
75、/p><p> ShowChangedBmp;</p><p><b> end;</b></p><p> 3、GaussLaplace算子</p><p> procedure TImageProcessForm.GaussLaplaceClick(Sender: TObject);</p><
76、;p> var p,p1,p2,p3,p4,p5:pbytearray ;</p><p> x,y:integer ;</p><p><b> begin</b></p><p> TestBMP.Assign(WillbeChangedBmp);</p><p> ProcessedBmp.Assi
77、gn(WillbeChangedBmp);</p><p> //temp.Assign(original_image.Picture.Bitmap);</p><p> //buffer.Assign(original_image.Picture.Bitmap);</p><p> for y:=2 to TestBMP.Height-3 do</p&
78、gt;<p><b> begin</b></p><p> p:=ProcessedBmp.ScanLine[y];</p><p> p1:=TestBMP.ScanLine[y-2];</p><p> p2:=TestBMP.ScanLine[y-1];</p><p> p3:=Test
79、BMP.ScanLine[y];</p><p> p4:=TestBMP.ScanLine[y+1];</p><p> p5:=TestBMP.ScanLine[y+2];</p><p> for x:=2 to TestBMP.Width-3 do</p><p><b> begin</b></
80、p><p> p[x*3]:=min(255,max(0,(-p1[3*x]-p2[3*(x-1)]-2*p2[3*x]-p2[3*(x+1)]</p><p> -p3[3*(x-2)]-2*p3[3*(x+1)]+16*p3[3*x]-2*p3[3*(x+1)]-p3[3*(x+2)]</p><p> -p4[3*(x-1)]-2*p4[3*x]-p4[3*
81、(x+1)]-p5[3*x])));</p><p> p[x*3+1]:=min(255,max(0,(-p1[3*x+1]-p2[3*(x-1)+1]-2*p2[3*x+1]-p2[3*(x+1)+1]</p><p> -p3[3*(x-2)+1]-2*p3[3*(x+1)+1]+16*p3[3*x+1]-2*p3[3*(x+1)+1]-p3[3*(x+2)+1]</p&g
82、t;<p> -p4[3*(x-1)]-2*p4[3*x]-p4[3*(x+1)]-p5[3*x])));</p><p> p[x*3+2]:=min(255,max(0,(-p1[3*x+2]-p2[3*(x-1)+2]-2*p2[3*x+2]-p2[3*(x+1)+2]</p><p> -p3[3*(x-2)+2]-2*p3[3*(x+1)+2]+16*p3[3
83、*x+2]-2*p3[3*(x+1)+2]-p3[3*(x+2)+2]</p><p> -p4[3*(x-1)+2]-2*p4[3*x+2]-p4[3*(x+1)+2]-p5[3*x]+2)));</p><p><b> end;</b></p><p><b> end;</b></p><
84、p> ChangedBmp.Assign(ProcessedBmp);</p><p> ShowChangedBmp;</p><p><b> end;</b></p><p><b> 4、矩形變?nèi)切?lt;/b></p><p> procedure TImageProcessF
85、orm.N11Click(Sender: TObject); //矩形變?nèi)切?lt;/p><p><b> var</b></p><p> u,v,x,y,w,h:Integer;</p><p> angle,r,xx,yy:single;</p><p><b> begin</b>
86、;</p><p> r:=image1.Width/2;</p><p> image2.Visible:=true;</p><p> image2.Height:=image1.Height;</p><p> image2.Width:=image1.Width;</p><p> w:=image1
87、.Picture.Bitmap.Width;</p><p> h:=image1.Picture.Bitmap.Height;</p><p> for u:=0 to h-1 do</p><p><b> begin</b></p><p> for v:=0 to w-1 do</p>&l
88、t;p><b> begin</b></p><p> angle:=(u*3.14159/w);</p><p> xx:=cos(angle)*v*w/(2*h);</p><p><b> yy:=v;</b></p><p> x:=Trunc(xx);</p>
89、<p> y:=Trunc(yy);</p><p> Image2.Canvas.Pixels[Trunc(r)+x,y]:=Image1.Canvas.Pixels[u,v];</p><p><b> end;</b></p><p><b> end;</b></p><p&
90、gt;<b> end;</b></p><p><b> 5、矩形變圓</b></p><p> procedure TImageProcessForm.N21Click(Sender: TObject); //矩形變圓</p><p><b> var</b></p>
91、<p> u,v,x,y:Integer;</p><p> angle1,angle2,r,xx,yy:single;</p><p><b> begin</b></p><p> image2.Height:=image1.Height;</p><p> image2.Width:=image
92、1.Width;</p><p> r:=image1.Width/3;</p><p> for u:=0 to image1.Picture.Bitmap.Width-1 do</p><p><b> begin</b></p><p> for v:=0 to image1.Picture.Bitmap.
93、Height-1 do</p><p><b> begin</b></p><p> angle1:=(u*3.14159/image1.Width);</p><p> angle2:=(v*3.14159/image1.Height);</p><p> xx:=cos(angle1)*(-r);</
94、p><p> yy:=cos(angle2)*(-sqrt(r*r-xx*xx));</p><p> x:=Trunc(xx);</p><p> y:=Trunc(yy);</p><p> Image2.Canvas.Pixels[Trunc(r)+x,Trunc(r)+y]:=Image1.Canvas.Pixels[u,v];&
95、lt;/p><p><b> end;</b></p><p><b> end;</b></p><p><b> end;</b></p><p><b> 6、矩形變菱形</b></p><p> procedure T
96、ImageProcessForm.N3Click(Sender: TObject); //矩形變菱形</p><p><b> var</b></p><p> u,v,x,y,w,h:Integer;</p><p> angle,r,xx,yy:single;</p><p><b> begin&
97、lt;/b></p><p> image2.Visible:=true;</p><p> image2.Height:=image1.Height;</p><p> image2.Width:=image1.Width;</p><p> r:=image1.Picture.Bitmap.Height/2;</p&g
98、t;<p> w:=image1.Picture.Bitmap.Width;</p><p> h:=image1.Picture.Bitmap.Height;</p><p> for u:=0 to w-1 do</p><p><b> begin</b></p><p> for v:=0
99、 to h-1 do</p><p><b> begin</b></p><p> angle:=(u*3.14159/w);</p><p> if (v<h/2) then</p><p> xx:=cos(angle)*(-v*w/h)</p><p><b>
100、else</b></p><p> xx:=cos(angle)*(-(h-v)*w/h);</p><p><b> yy:=v;</b></p><p> x:=Trunc(xx);</p><p> y:=Trunc(yy);</p><p> Image2.Canva
101、s.Pixels[x+trunc(r),y]:=Image1.Canvas.Pixels[u,v];</p><p><b> end;</b></p><p><b> end;</b></p><p><b> end;</b></p><p><b>
102、7、灰度化</b></p><p> procedure TImageProcessForm.Gray1Click(Sender: TObject);</p><p><b> var</b></p><p> p: pbyteArray;</p><p> Gray,x, y: Integer;&l
103、t;/p><p><b> begin</b></p><p> TestBMP.Assign(WillbeChangedBmp); // WillbeChangedBmp賦予彩色圖像</p><p> for y := 0 to TestBMP.Height - 1 do</p><p><b> beg
104、in</b></p><p> //獲取每一行象素信息</p><p> p := TestBMP.scanline[y]; //掃描</p><p> for x := 0 to TestBMP.Width - 1 do</p><p><b> begin</b></p><p
105、> //這里采用YUV與RGB顏色空間變換的方法,即 Y=0.3R+0.59G+0.11B</p><p> Gray := Round(p[3 * x + 2] * 0.3 + p[3 * x + 1] * 0.59</p><p> + p[3 * x] * 0.11);</p><p> //由于是24位真彩色,故一個(gè)像素點(diǎn)為三個(gè)字節(jié),且每個(gè)字節(jié)
106、的值相等</p><p> p[3 * x + 2] := byte(Gray);</p><p> p[3 * x + 1] := byte(Gray);</p><p> p[3 * x] := byte(Gray);</p><p> //Gray的值必須在0~255之間</p><p><b>
107、; end;</b></p><p><b> end;</b></p><p> ChangedBmp.Assign(TestBMP);</p><p> ShowChangedBmp;</p><p><b> end;</b></p><p>&l
108、t;b> 8、反色</b></p><p> procedure TImageProcessForm.InvertImageClick(Sender: TObject);//反色</p><p><b> var</b></p><p> p: PByteArray;</p><p> X,
109、Y: Integer;</p><p><b> begin</b></p><p> TestBMP.Assign(WillbeChangedBmp);</p><p> for Y := 0 to TestBMP.Height - 1 do</p><p><b> begin</b>&
110、lt;/p><p> p := TestBMP.scanline[y];</p><p> for X := 0 to TestBMP.Width - 1 do</p><p><b> begin</b></p><p><b> begin</b></p><p>
111、 p[x * 3] := not p[x * 3];</p><p> p[x * 3 + 1] := not p[x * 3 + 1];</p><p> p[x * 3 + 2] := not p[x * 3 + 2];</p><p><b> end</b></p><p><b> end;&
112、lt;/b></p><p><b> end;</b></p><p> ChangedBmp.Assign(TestBMP);</p><p> ShowChangedBmp;</p><p><b> end;</b></p><p><b>
113、 9、二值化腐蝕</b></p><p> procedure TImageProcessForm.TowvalueErodeClick(Sender: TObject); //二值化腐蝕</p><p><b> var</b></p><p> X, Y: integer;</p><p> p1
114、,p2,p3,p4: pByteArray;</p><p><b> begin</b></p><p> TestBMP.Assign(WillbeChangedBmp);</p><p> ProcessedBmp.Assign(WillbeChangedBmp);</p><p> for Y := 1
115、to ProcessedBmp.Height - 2 do</p><p><b> begin</b></p><p> p1 := TestBMP.ScanLine[Y];</p><p> P2 := ProcessedBmp.ScanLine[Y - 1];</p><p> p3 := Processe
116、dBmp.ScanLine[Y];</p><p> p4 := ProcessedBmp.ScanLine[Y + 1];</p><p> for X := 1 to ProcessedBmp.Width - 2 do</p><p><b> begin</b></p><p> if ((p1[3 * X
117、] = 0) and (p1[3 * X + 1] = 0) and (p1[3 * X + 2]</p><p> = 0)) then</p><p><b> begin</b></p><p> // 判斷黑點(diǎn)左右鄰居是否有白色點(diǎn),有則腐蝕,置該點(diǎn)為白色</p><p> // 白色點(diǎn)則保持不變</
118、p><p> if (((p3[3 * (X - 1)] = 255) and (p3[3 * (X - 1) + 1] =</p><p> 255) and (p3[3 * (X - 1) + 2] = 255)) or ((p3[3 * (X</p><p><b> +</b></p><p> 1)] =
119、255) and (p3[3 * (X + 1) + 1] = 255) and</p><p> (p3[3 * (X + 1) + 2] = 255)) or ((P2[3 * X] = 0) and</p><p> (P2[3 * X + 1] = 255) and (P2[3 * X + 2] = 255))</p><p> or ((p4[3 *
120、 X] = 255) and (p4[3 * X + 1] = 255) and</p><p> (p4[3* X + 2] = 255))) then</p><p><b> begin</b></p><p> p1[3 * X] := 255;</p><p> p1[3 * X + 1] := 255
121、;</p><p> p1[3 * X + 2] := 255;</p><p> //// 將滿足條件的黑色點(diǎn)置為白色</p><p><b> end;</b></p><p><b> end;</b></p><p><b> end;</b
122、></p><p><b> end;</b></p><p><b> //begin</b></p><p> //for Y := 1 to ProcessedBmp.Height - 2 do</p><p><b> //begin</b></p&
123、gt;<p> //p1 := TestBMP.ScanLine[Y];</p><p> //p3 := ProcessedBmp.ScanLine[Y];</p><p> //for X := 1 to ProcessedBmp.Width - 2 do</p><p><b> //begin</b></p&
124、gt;<p> // 判斷一個(gè)黑點(diǎn)上下鄰居是否有白點(diǎn),有則腐蝕,置黑點(diǎn)為白色</p><p> // 白色點(diǎn)就保持不變</p><p> //if ((p1[3 * X] = 0) and (p1[3 * X + 1] = 0) and (p1[3 * X + 2]</p><p> //= 0)) then</p><
125、p><b> //begin</b></p><p> //if (((p3[3 * (X - 1)] = 255) and (p3[3 * (X - 1) + 1] =</p><p> //255) and (p3[3 * (X - 1) + 2] = 255)) or ((p3[3 * (X</p><p><b>
126、 //+</b></p><p> //1)] = 255) and (p3[3 * (X + 1) + 1] = 255) and</p><p> //(p3[3 * (X + 1) + 2] = 255))) then</p><p><b> //begin</b></p><p> //p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖形學(xué)課程設(shè)計(jì)-- 計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)--圖形學(xué)基礎(chǔ)圖形處理實(shí)現(xiàn)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)--- 轉(zhuǎn)動(dòng)鐘表
- 計(jì)算機(jī)圖形學(xué)論文-計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)-- 彈跳的彩球動(dòng)畫
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)——掃雷游戲程序設(shè)計(jì)
- 圖形學(xué)教案計(jì)算機(jī)圖形學(xué)a
- barsky直線裁剪算法計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)構(gòu)造完整系統(tǒng)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)--圓柱面圖像紋理映射算法
- 計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告---多邊形剪裁和填充圖形軟件設(shè)計(jì)
- 計(jì)算機(jī)圖形學(xué)簡介
- 計(jì)算機(jī)圖形學(xué)題庫
- 計(jì)算機(jī)圖形學(xué)答案
- 計(jì)算機(jī)圖形學(xué)簡介
- 計(jì)算機(jī)圖形學(xué)試題
評論
0/150
提交評論