当前位置:首页 » 编程语言 » 膨胀算法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;

}