當前位置:首頁 » 編程語言 » 膨脹演算法sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

膨脹演算法sql

發布時間: 2022-06-19 21:00:31

『壹』 問一下關於腐蝕和膨脹演算法的問題

求演算法復雜度一般不會使用計算機進行驗證而是分析程序運行所需要的機器指令個數與輸入的數據之間的函數關系。如果你想編寫一個程序來尋找提高速度的演算法,我想是本末倒置了。首先你得有幾個正確的演算法,然後才能為這幾個演算法分別編程,最後使用測試案例來驗證哪個演算法的性能更好些。

『貳』 通貨膨脹率計算公式

通貨膨脹率(價格上漲率)=(已發行的貨幣量-流通中實際所需要的貨幣量)/ 流通中實際所需要的貨幣量×100%。

通過價格指數的增長率來計算通貨膨脹率,價格指數可以分別採用消費者價格指數(CPI)、生產者價格指數(PPI)、GNP折算價格指數。其公式如下:

CPI=a1(P1t/P10)+a2(P2t/P20)+……+an(Pnt/Pn0)(註:式中的數字和t、n均為下標,P為代表性消費品的價格,a為權重)。

(2)膨脹演算法sql擴展閱讀

事實上,從長期來看,真正能夠決定通貨膨脹率還是經濟基本面。因此,通過名義經濟增速與實際經濟增速之間的差額更能反映所要解決的問題,也即長期通貨膨脹率=名義經濟增速-實際經濟增速。

需要指出得是,雖然該方法從邏輯上更為自恰,但較少被使用,主要是因為用該方法計算出的通貨膨脹率頻率更低(主要為季度)且滯後性更明顯。

貨幣主義對菲利普斯曲線的研究納入了預期因素,認為總供給和菲利普斯曲線長期都是垂直的。其政策含義是:需求管理對長期的產出和就業沒有影響。

理性預期學派的經濟學家所持觀點更加極端,他們認為短期內總供給和菲利普斯曲線也是垂直的,因此,政府的需求管理政策短期內也是無效的,總需求增加的作用是抬高物價。理性預期學派關於菲利普斯曲線的討論有兩個前提:

(1)彈性的工資和價格假設。

(2)理性預期假設。

由於通貨膨脹和失業的同時並存,凱恩斯主義的觀點發生了一些變化,主要強調成本推動因素的重要性,強調均衡失業的重要性,闡述需求不足失業存在的合理性,吸收了預期理論。

『叄』 通貨膨脹的計算公式是什麼

通貨膨脹率=(現期物價水平—基期物價水平)/基期物價水平 其中基期就是選定某年的物價水平作為一個參照,這樣就可以把其他各期的物價水平通過與基期水平作一對比,從而衡量現今的通貨膨脹水平。其實,上面所說的只是三種衡量通貨膨脹水平方法之一的消費指數折演算法,但它是最常用的,此外還有GDP折演算法和生產指數折演算法。

『肆』 數字圖像處理膨脹的目的

膨脹就是使用演算法,將圖像的邊緣擴大些。作用就是將目標的邊緣或者是內部的坑填掉。
膨脹的演算法: 用3x3的結構元素,掃描圖像的每一個像素 用結構元素與其覆蓋的二值圖像做「與」操作 如果都為0,結果圖像的該像素為0。否則為1 結果:使二值圖像擴大一圈。

『伍』 通貨膨脹演算法。。。求指教!!!!!!!!!!!!

房價指數的增長率其實是通貨膨脹率+實際增長率。
所以房價指數的實際增長率等於:
216/182-(1+0.016)=0.171,意味著房價實際增長率為17.1%

『陸』 地球膨脹運動的參數演算法與膨脹階段劃分

在論證了地球的脹縮運動以後,有關地球膨脹運動的計算及其演算法、地球膨脹階段的劃分等就成為人們必須考慮的主題。

在本節里,將討論地球膨脹階段的地球表面積、體積、半徑等參數的改變數計算方法,對如何根據實際資料求取地球膨脹的數值等技術手段做出說明,並列出相關計算公式。根據以往的研究成果對地球膨脹階段的劃分提出新的認識,將地球的膨脹劃分為:表面積擴充階段、體積擴充階段、岩漿外溢量持續增大階段、岩漿外溢量持續減小階段、地球收縮階段等。地球的膨脹過程既不是半徑一概增大的過程,也非單調減小的過程,而是一種受周期性函數作用力控制的,地球半徑在「增加一減小—增加—減小」的循環往復中逐漸增長。

1.膨脹參數的求取

地球膨脹的證據為我們提供了分析研究地球膨脹量的強有力資料。

在尚未論述洋中脊和海溝的特點與形成原因之前,首先假設以下條件成立:

(1)洋中脊是地球膨脹時期的產物,洋中脊的擴張范圍就是地球的膨脹表面積之一。

(2)海溝是板塊與板塊結合地帶,是一種向地幔層方向褶皺的「負向山脈」,它與洋中脊不是同期產物。

(3)假設地球膨脹時期的造山運動大約等於零,地球的表面積縮小量約為零。

(4)假設地球膨脹時期相鄰兩陸塊之間若不被後期的洋中脊分開,就不存在顯著的分離。

於是,地球的膨脹參數可以按照如下方法獲得:

1.1地球膨脹所產生的表面積改變數(△S)

設地球收縮後且膨脹前的表面積為SA,地球膨脹運動結束後且開始膨脹前的表面積為SB,則地球膨脹運動所產生的表面積改變數

圖4-4萊茵地塹綜合剖面圖

(a)地溫剖面圖(據Illies,1965);(b)布格異常剖面(據Mieller等,1967);(c)磁測剖面(據Roche和Wohlehberg,1969);(d)地質剖面1(據Mueller,1969);(e)地質剖面2(據Sittler,1967);(f)總體剖面(據Illies,1967)

地球動力與運動

式中,各變數單位均為km2

式(4-1)是一個理論方程,實際工作中是沒法操作的。在實際工作中,地球表面積的改變數可按下式求取:

地球動力與運動

或者:

地球動力與運動

式中,S1,S2,S3,…,Sn等在形成時期、單位等方面具有一致性。可以進行如下約定:

S1——洋中脊擴張范圍面積(km2);

S2——板塊之間裂谷范圍面積(km2);

S3——板塊內部裂谷范圍面積(km2);

S4——板塊內部地塹范圍面積(km2);

S5——板塊內部所有正斷裂平面張開范圍面積(km2);

Sn——相當於式(4-2)中的δ,其他可能遺漏的因地球膨脹產生的未單獨列出的面積(km2)。取n=6,則Sn=S6,即地球膨脹的表面積增加包括6方面內容。那麼式(4-2)、式(4-3)可改為:

地球動力與運動

求S1

依據假設條件,洋中脊的擴張范圍就是地球的膨脹表面積,只要求得洋中脊的范圍面積,即求得了S1。顯然:

地球動力與運動

式中,S11,S12,S13,…,S1n等,分別代表不同洋脊的擴張范圍面積,如:北太平洋洋脊、南太平洋洋脊、智利洋脊、印度洋—太平洋洋脊等等。下面以北太平洋洋脊為例,說明如何計算洋脊的擴張范圍:

地球膨脹發展到一定程度,首先引起固態岩石圈的張開,洋中脊的產生與發展則建立在板塊或板塊間的破裂基礎上,隨著地球的膨脹,「液」態的地幔物質膨脹速度大於固態物質的膨脹速度,因而岩漿順著板塊間的裂口向「外」拓展空間,以平衡因膨脹而產生的體積增量,這種過程在地球膨脹期內將不斷地進行,在進行過程中,外逸的岩漿不斷地排開最初的板塊裂口,使板塊之間的距離越來越大,當地球膨脹停止時,在原來的狀態下,出現了擴張後的大面積增量,即為所求增量。板塊最初的裂紋無疑是岩漿填充時的背景,由於板塊最初的裂紋不同,洋中脊具有不同的擴張形態,其中被人們稱為轉換斷層的裂縫,即是最初的裂紋呈折線的結果。只要圈定出板塊最初裂紋,即求得了洋中脊的擴張范圍,再用求積儀計算圈線所佔面積。

完成全球各洋脊的擴張范圍面積計算,即求得了S1

採用找最初彌合線—圈線—計算面積的辦法,同樣施於對S2、S3、S4、S5、S6的求取,最後對所得各類面積用式(4-4)累加,即可獲得地球膨脹後地球表面積的擴張增量。

1.2地球膨脹所產生的體積改變數(△V)

在獲得了地球膨脹的表面積增量後,求取體積的增量顯得簡單一些。為了便於分析,先看幾條剖面圖(見圖4-5)。

圖4-5幾條過洋中脊的地形剖面(據Heirtzler,1966)

(a)大西洋剖面(據米康,1962);(b)東太平洋剖面(據H.W.米納德,1969);(c)南太平洋剖面

三條不同海域的過洋中脊的地形圖,是各地洋中脊不斷變化形成的縮影,顯而易見,他們共同具有的特徵就是從洋中脊中心向兩側逐漸變緩,形成了中間高、兩側低的勢態,這是地幔物質因膨脹、體積變大、外逸卸載所造成。因此,在計算地球膨脹的體積改變數時,應按照如下算式計算(見圖4-6):

地球動力與運動

式中:V1——由表面積改變數換算所得體積改變數,單位:km3。換算式如下:

地球動力與運動

V2——洋中脊的多餘外逸量,單位:km3。算式如下:

地球動力與運動

ζ——調節數,單位與其他項一致,為遺漏量或計算誤差,可正可負,其絕對值相比之下應為小。

式(4-7)中,RA為地球膨脹前的地球半徑;R為地球膨脹後地殼半徑的伸長量。由於地殼的張裂,地幔膨脹一方面通過地殼的裂口外逸部分岩漿,另一方面直接將地殼向「外」推開而擴展自身空間,R即為這種效應的改變數;RB為地球膨脹後最終量,與R之間的增量等於洋中脊在RB之外的多餘量,它是洋中脊的凸隆體積部分碾平後覆蓋地球表面所形成的厚度值(參閱圖4-6)。

圖4-6地球膨脹參數關系

式(4-9)中,i值的改變表示洋中脊的不同,不同的洋中脊有不同的分布范圍和不同的高度、不同的體積,計算式如下:

地球動力與運動

式中,S為洋中脊的橫斷面面積;dl為微元的長度。

1.3地球膨脹所產生的半徑改變數(△R)

由圖4-6可知,地球膨脹運動所產生的地球半徑的改變數計算式為:

地球動力與運動

也可由下式計算:

地球動力與運動

式中,RA或RB可以通過現代地球物理探測方法獲得,按照地球目前處於近銀點附近的一般觀點,地球正處於地球收縮期,地球現在的半徑測值既不是RA,也不是RB,要想獲得RA或RB,還要計算地球在喜馬拉雅造山運動時期的地球半徑改變數。

地球半徑的改變數也可以通過體積改變數和表面積改變數直接計算獲得。

2.地球的膨脹階段劃分

自從人們認識了地球曾經發生過膨脹運動後,有關地球膨脹的模式就一直成為人們探求的課題。在本書內容形成以前,有四種膨脹模式較為突出:單一膨脹式、非對稱膨脹式(凱里模式)、威廉斯模式、脈沖膨脹式。四種有關地球的膨脹模式,由於缺乏系統理論的指導,盡管在某一方面或某幾方面考慮周到,但總不能避免局限性,有時甚至出現不能自圓其說的局面。

我們說地球的膨脹體現有兩種,一種是短周期的膨脹,主要是由於地球繞太陽運行受太陽的作用而引起,體現在地球大氣層的變化上;另一種是長周期的膨脹,主要是由於地球繞銀核運行受銀核的作用而引起,體現在地球的岩石圈的變化上。地球膨脹是由於地球受到了膨脹力作用,這種作用力實質上是一種脹縮力。在地球軌道一周內,一段時期表現為膨脹力作用,而在另一段時期內則表現為壓縮力作用。地球所受膨脹力既不是一概增大的過程,也不是單調減小的過程,而是在壓縮力之後表現為單調增加,當達到極大值後又表現為單調減小,是一種含周期性函數特徵的作用力,在這種力作用下,地球的膨脹表現在地球半徑的增量△R隨時間呈一種幅度、跨度為非對稱的曲線形態,這種形態可用圖4-7加以示意,由此可見,在地史長河中,地球的半徑在「增加—減小—增加—減小」的循環往復中逐漸地增長。

圖4-7膨脹過程中地球半徑增量隨時間變化關系曲線示意圖

膨脹力作用於地球使地球發生膨脹的過程可分為四個階段:表面積擴充階段、體積擴充階段、膨脹力持續增大作用階段、膨脹力持續減小直至為零作用階段,各階段用圖簡示如圖4-8。

圖4-8陸塊的張裂過程

1—地球膨脹使陸塊分裂而增加地球表面積;2—地球繼續膨脹使地幔外逸而增加地球體積;3—地球受不斷增大的膨脹作用,地球表面積、體積體積變大的同時、岩漿大量外逸,洋中脊越來越向外凸出;4—地球仍在膨脹,但作用力逐漸變小,岩漿外逸量逐漸減小,洋中脊向內凹進

2.1表面積擴充階段

地球的表面積擴充階段是指地球從地殼發生張裂開始到岩漿從裂谷中逸出前的階段。

地球受到膨脹力作用後,地球的各個層圈都將發生膨脹改變,這些改變數全部體現在包裹在外的地殼上,由於膨脹所引起的體積增加必須通過表面積的增加來完成,所以,作為剛性體的地殼發生張裂,張裂氛圍板間張裂和板內張裂,張裂逐漸加深加寬,一方面完成了體積增量的空氣填充,主要的一方面是使地球的表面積得到了擴張。這樣的張裂過程在地球膨脹的最初階段,隨著地球體積的變大,由裂縫—裂口—裂谷逐漸展開的(圖4-9)。

圖4-9板塊的破裂與運動過程

A—板塊在地球的脹縮力作用下在中部發生破裂;B—隨著持續膨脹,裂縫形成開口;C—形成裂谷

2.2體積擴充階段

地球的體積擴充階段是指岩漿從裂谷中逸出開始,到岩漿停止持續流出為止。這一階段實質上包含了後面即將談到的兩個階段。

盡管地球的體積膨脹從理論上講是在地球受膨脹力作用開始的瞬間就已經開始,但卻無法在實際中將這一起點劃分出來。將地球的體積擴充階段的起點定在岩漿開始從裂谷中大量外逸,是具有實際意義和理論意義的。

2.3岩漿外逸量持續增大階段

岩漿外逸量持續增大階段是指岩漿從裂谷中大量逸出開始,到岩漿外逸量突然急劇下降前為止,在洋中脊變化曲線上表現為上升趨勢出現急劇下降(如圖4-10)。

圖4-10大西洋洋中脊所表現的地球體積膨脹階段

A—岩漿外逸量持續增大階段;B—岩漿外逸量持續減小階段

當裂谷中開始出現大量外逸的岩漿時,表明地球內部物質的體積增大速度大於地殼膨脹速度,地球的整體膨脹開始向新的動態發展。當膨脹力持續作用,內部物質體積膨脹量越來越大,由於地殼的重載使岩漿的外逸量越來越大,形成了從裂谷最初的外逸岩漿之處向洋中脊方向越來越凸出的地形特徵(見圖4-5)。

2.4岩漿外逸量持續減小階段

岩漿外逸量持續減小直至為零的作用階段是指岩漿外逸量突然急劇下降開始到岩漿停止持續流出為止(見圖4-10)。

顯然,圖面顯示出這一階段在洋脊變化曲線上為非對稱性,是可以理解的,岩漿的外逸從第三階段到第四階段,從一種動態平衡狀態向另一種狀態過渡,由於膨脹的增量出現減小,而地球各個圈層向外膨脹的邊界條件(包括地殼板塊的鬆散環境)、岩漿外逸口的大小等並沒有發生改變,所以會出現各種對稱與非對稱的洋脊形態。

從時間上講,圖4-10中的A、B兩階段是不相等的;從膨脹的改變數來講,A、B兩階段也是不相同的。圖中距離長短的不一是因為B階段為膨脹力作用的後期,地球盡管還在膨脹,但膨脹增量越來越小,經過了A階段持續加大過程,這時,地球的持續減小的膨脹增量主要體現在地球半徑的膨脹上,由於B階段地球整體膨脹已經足以完成因膨脹力作用而產生的地球體積的改變數,所以,岩漿的外逸量越來越少,而A階段則是因地球整體膨脹速度不足以平衡體積改變數。

2.5地球收縮階段

地球結束了膨脹力作用,變成完全受收縮力作用的階段,在此階段,地球的半徑持續變小。

3.關於地球的膨脹造山問題

如果說膨脹時期的地球也能造山的話,無疑這山是指洋中脊(也稱海隆)了。地史上曾經出現過一種地球膨脹造山的說法,即馬欽斯基(M.Matschinski,1953)所提出的觀點。他是在地球膨脹說的氛圍里提出的,其目的只是為了解釋地球在膨脹時可以造山,盡管存在很多疑問,但這一觀點卻無疑給人一種新的思路。他認為,地球膨脹時由於膨脹速率不同,出現地幔膨脹後的曲率與地殼膨脹後的曲率不同而形成地殼的懸空,在重力作用下,板塊的中部出現了推覆造山作用。馬欽斯基的膨脹造山模式給人啟發是:地球在膨脹時是有可能在局部地區發生造山作用的,如地球在潮汐力作用下,發生局部膨脹,當這種潮汐波傳播走後,即可形成馬欽斯基所描述的情形。當然,由潮汐力引起的局部膨脹在地球發生收縮運動時也可以產生。

以上論證了地球膨脹的有關參數計算問題,並進行了相關階段的劃分,採用的是一套歸納思維方法,主要根據已有的證據來求取變化參數,屬於後驗性,對預測幫助較小。後面還將提出一套根據地球所在軌道位置計算預測以後不同時間段內將要發生的變化及變化量的理論演算法。

『柒』 圖像膨脹腐蝕演算法原理

膨脹和腐蝕的主要用途:
消除雜訊;
分割出獨立的圖像元素,在圖像中連接相鄰的元素;
尋找圖像中明顯的極大值或極小值區;
求出圖像的梯度;
【注】:
腐蝕和膨脹是對像素值大的部分而言的,即高亮白部分而不是黑色部分;
膨脹是圖像中的高亮部分進行膨脹,領域擴張,效果圖擁有比原圖更大的高亮區域;
腐蝕是圖像中的高亮部分被腐蝕掉,領域縮減,效果圖擁有比原圖更小的高亮區域;
2
/9
膨脹原理:
膨脹:求局部最大值;
①定義一個卷積核B,
核可以是任何的形狀和大小,且擁有一個單獨定義出來的參考點-錨點(anchorpoint);
通常和為帶參考點的正方形或者圓盤,可將核稱為模板或掩膜;
②將核B與圖像A進行卷積,計算核B覆蓋區域的像素點最大值;
③將這個最大值賦值給參考點指定的像素;
因此,圖像中的高亮區域逐漸增長。
3
/9
腐蝕原理:
腐蝕:局部最小值(與膨脹相反);
①定義一個卷積核B,
核可以是任何的形狀和大小,且擁有一個單獨定義出來的參考點-錨點(anchorpoint);
通常和為帶參考點的正方形或者圓盤,可將核稱為模板或掩膜;
②將核B與圖像A進行卷積,計算核B覆蓋區域的像素點最小值;
③將這個最小值賦值給參考點指定的像素;
因此,圖像中的高亮區域逐漸減小。
4
/9
OpenCV中膨脹函數-dilate()
格式:
void dilate(
InputArray src,//輸入
OutputArray dst, //輸出
InputArray kernel, //核大小
Point anchor=Point(-1,-1),// 錨位置,(-1,-1)為中心
int iterations=1, //迭代次數
int borderType=BORDER_CONSTANT,//圖像邊界像素模式
const Scalar& borderValue=morphologyDefaultBorderValue()//邊界值
)
【注】:
關於核,一般配合getStructuringElement()使用;
getStructuringElement():返回指定形狀和尺寸的結構元素;
格式:
getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));
參數:
shape:表核的形狀,矩形MORPH_RECT;交叉形MORPH_CROSS;橢圓形MORPH_ELLIPSE;
ksize:核尺寸大小;
anchor:錨點的位置,錨點隻影響形態學運算結果的偏移;
5
/9
OpenCV中腐蝕函數-erode()
格式:
void erode(
InputArray src,//輸入
OutputArray dst, //輸出
InputArray kernel, //核大小
Point anchor=Point(-1,-1),// 錨位置,(-1,-1)為中心
int iterations=1, //迭代次數
int borderType=BORDER_CONSTANT,//圖像邊界像素模式
const Scalar& borderValue=morphologyDefaultBorderValue()//邊界值
)
6
/9
形態學開運算:
開運算(Open Operation):先腐蝕後膨脹的過程;
功能:
消除小物體;
在纖細處分離物體;
平滑較大的邊界並不明顯改變其面積;
7
/9
形態學閉運算:
閉運算(Closing Openration),先膨脹後腐蝕;
功能:
排除小型黑洞(黑斑);
8
/9
OpenCV:morphologyEx()
功能:morphologyEx函數利用基本的膨脹和腐蝕技術,來執行更加高級形態學變換,
如開閉運算,形態學梯度,「頂帽」、「黑帽」等等。

『捌』 通貨膨脹率的計算公式

通貨膨脹率=(現期物價水平—基期物價水平)/基期物價水平
其中基期就是選定某年的物價水平作為一個參照,這樣就可以把其他各期的物價水平通過與基期水平作一對比,從而衡量現今的通貨膨脹水平。其實,上面所說的只是三種衡量通貨膨脹水平方法之一的消費指數折演算法,但它是最常用的,此外還有GDP折演算法和生產指數折演算法。
20世紀70年代後,隨著浮動匯率取代了固定匯率,通貨膨脹對匯率變動的影響變得更為重要了。通貨膨脹意味著國內物價水平的上漲,當一個經濟中的大多數商品和勞務的價格連續在一段時間內普遍上漲時,就稱這個經濟經歷著通貨膨脹。由於物價是一國商品價值的貨幣表現,通貨膨脹也就意味著該國貨幣代表的價值量下降。在國內外商品市場相互緊密聯系的情況下,一般地,通貨膨脹和國內物價上漲,會引起出口商品的減少和進口商品的增加,從而對外匯市場上的供求關系發生影響,導致該國匯率波動。同時,一國貨幣對內價值的下降必定影響其對外價值,削弱該國貨幣在國際市場上的信用地位,人們會因通貨膨脹而預期該國貨幣的匯率將趨於疲軟,把手中持有該國貨幣轉化為其他貨幣,從而導致匯價下跌。按照一價定律和購買力平價理論,當一國的通貨膨脹率高於另一國的通貨膨脹率時,則該國貨幣實際所代表的價值相對另一國貨幣在減少,該國貨幣匯率就會下降。反之,則會上升。
例如,20世紀90年代之前,日元和原西德馬克匯率十分堅挺的一個重要原因,就在於這兩個國家的通貨膨脹率一直很低。而英國和義大利的通貨膨脹率經常高於其他西方國家的平均水平,故這兩國貨幣的匯率一下處於跌勢。

『玖』 數字圖像處理 膨脹和腐蝕演算法的實現

腐蝕的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為1,結果圖像的該像素為1。否則為0。
結果:使二值圖像減小一圈
定義:E = B  S = { x,y | SxyB}

膨脹的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為0,結果圖像的該像素為0。否則為1
結果:使二值圖像擴大一圈
定義:E = B  S = { x,y | Sxy∩B ≠Ф}

『拾』 如何進行數字圖像處理中的膨脹和腐蝕計算

腐蝕的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為1,結果圖像的該像素為1。否則為0。
結果:使二值圖像減小一圈
定義:E = B  S = { x,y | SxyB}

膨脹的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為0,結果圖像的該像素為0。否則為1
結果:使二值圖像擴大一圈
定義:E = B  S = { x,y | Sxy∩B ≠Ф}

膨脹源碼

BOOL Dilation(HWND hWnd,BOOL Hori)

{

DWORD OffBits,BufSize;

LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr;

HDC hDc;

HFILE hf;

LONG x,y;

unsigned char num;

int i;

//為了處理的方便,仍採用256級灰度圖,不過只調色板中0和255兩項

if( NumColors!=256){

MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",

"Error Message",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

//BufSize為緩沖區大小

BufSize=OffBits+bi.biHeight*LineBytes;

//為新的緩沖區分配內存

if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)

{

MessageBox(hWnd,"Error alloc memory!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

//拷貝頭信息和點陣圖數據

memcpy(lpTempImgData,lpImgData,BufSize);

if(Hori)

{

//在水平方向進行膨脹運算

for(y=0;y<bi.biHeight;y++){

//lpPtr指向原圖數據,lpTempPtr指向新圖數據

lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+1;

lpTempPtr=(char*)lpTempImgData+

(BufSize-LineBytes-y*LineBytes)+1;

for(x=1;x<bi.biWidth-1;x++){

//注意為防止越界,x的范圍從1到寬度-2

num=(unsigned char)*lpPtr;

//原圖中是黑點的,新圖中肯定也是,所以要考慮的是那些原圖

//中的白點,看是否有可能膨脹成黑點

if (num==255){

*lpTempPtr=(unsigned char)255; //先置成白點

for(i=0;i<3;i++){

num=(unsigned char)*(lpPtr+i-1);

//只要左右鄰居中有一個是黑點,就膨脹成黑點

if(num==0){

*lpTempPtr=(unsigned char)0;

break;

}

}

}

//原圖中就是黑點的,新圖中仍是黑點

else *lpTempPtr=(unsigned char)0;

//指向下一個象素

lpPtr++;

lpTempPtr++;

}

}

}

else{

//在垂直方向進行腐蝕運算

for(y=1;y<bi.biHeight-1;y++){ //注意為防止越界,y的范圍從1到高度-2

lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);

lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);

for(x=0;x<bi.biWidth;x++){

num=(unsigned char)*lpPtr;

if (num==255){

*lpTempPtr=(unsigned char)255;

for(i=0;i<3;i++){

num=(unsigned char)*(lpPtr+(i-1)*LineBytes);

//只要上下鄰居中有一個是黑點,就膨脹成黑點

if(num==0){

*lpTempPtr=(unsigned char)0;

break;

}

}

}

else *lpTempPtr=(unsigned char)0;

lpPtr++;

lpTempPtr++;

}

}

}

if(hBitmap!=NULL)

DeleteObject(hBitmap);

hDc=GetDC(hWnd);

//產生新的點陣圖

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,

(LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData,

DIB_RGB_COLORS);

//起不同的結果文件名

if(Hori)

hf=_lcreat("c:\\hdilation.bmp",0);

else

hf=_lcreat("c:\\vdilation.bmp",0);

_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));

_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

_lclose(hf);

//釋放內存及資源

ReleaseDC(hWnd,hDc);

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

return TRUE;

}

腐蝕源碼

BOOL Erosion(HWND hWnd,BOOL Hori)

{

DWORD OffBits,BufSize;

LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr;

HDC hDc;

HFILE hf;

LONG x,y;

unsigned char num;

int i;

//為了處理方便,仍採用256級灰度圖,不過只用調色板中0和255兩項

if( NumColors!=256){

MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",

"Error Message",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

//BufSize為緩沖區大小

BufSize=OffBits+bi.biHeight*LineBytes;

//為新的緩沖區分配內存

if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)

{

MessageBox(hWnd,"Error alloc memory!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

//拷貝頭信息和點陣圖數據

memcpy(lpTempImgData,lpImgData,BufSize);

if(Hori)

{

//在水平方向進行腐蝕運算

for(y=0;y<bi.biHeight;y++){

//lpPtr指向原圖數據,lpTempPtr指向新圖數據

lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+1;

lpTempPtr=(char*)lpTempImgData+

(BufSize-LineBytes-y*LineBytes)+1;

for(x=1;x<bi.biWidth-1;x++){

//注意為防止越界,x的范圍從1到寬度-2

num=(unsigned char)*lpPtr;

if (num==0){ //因為腐蝕掉的是黑點,所以只對黑點處理

*lpTempPtr=(unsigned char)0; //先置成黑點

for(i=0;i<3;i++){

num=(unsigned char)*(lpPtr+i-1);

if(num==255){

//自身及上下鄰居中若有一個不是黑點,則將該點腐

//蝕成白點

*lpTempPtr=(unsigned char)255;

break;

}

}

}

//原圖中就是白點的,新圖中仍是白點

else *lpTempPtr=(unsigned char)255;

//指向下一個象素

lpPtr++;

lpTempPtr++;

}

}

}

else{

//在垂直方向進行腐蝕運算

for(y=1;y<bi.biHeight-1;y++){ //注意為防止越界,y的范圍從1到高度-2

//lpPtr指向原圖數據,lpTempPtr指向新圖數據

lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);

lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);

for(x=0;x<bi.biWidth;x++){

num=(unsigned char)*lpPtr;

if (num==0){ //因為腐蝕掉的是黑點,所以只對黑點處理

*lpTempPtr=(unsigned char)0; //先置成黑點

for(i=0;i<3;i++){

num=(unsigned char)*(lpPtr+(i-1)*LineBytes);

if(num==255){

//自身及上下鄰居中若有一個不是黑點,則將該點腐

//蝕成白點

*lpTempPtr=(unsigned char)255;

break;

}

}

}

//原圖中就是白點的,新圖中仍是白點

else *lpTempPtr=(unsigned char)255;

//指向下一個象素

lpPtr++;

lpTempPtr++;

}

}

}

if(hBitmap!=NULL)

DeleteObject(hBitmap);

hDc=GetDC(hWnd);

//產生新的點陣圖

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,

(LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);

//起不同的結果文件名

if(Hori)

hf=_lcreat("c:\\herosion.bmp",0);

else

hf=_lcreat("c:\\verosion.bmp",0);

_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));

_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

_lclose(hf);

//釋放內存及資源

ReleaseDC(hWnd,hDc);

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

return TRUE;

}