前言在最后一篇文章中,我们解释了图像处理中的阈值函数。在这篇文章中,我们将做膨胀和腐蚀功能。膨胀和腐蚀理论的概念可能很难解释。我们来看图片,首先是原图:。
扩张后会变成这样:
腐蚀后会变成这样:
可能看起来很费解,明明是膨胀,为什么字反而变细了,明明是腐蚀,为什么字反而变粗了。其实所谓的膨胀应该是指颜色越亮的色块越膨胀。所谓腐蚀,应该是指较亮的色块的腐蚀。在上图中,因为白色背景是一个较亮的色块,所以较暗的黑色块的文字在展开时会被压扁.相反,当被腐蚀时,单词会吸水并膨胀.用数学公式表示:。
说白了就是在指定大小的内核里找最暗或者最亮的像素点,并用该点替换掉内核锚点上的像素。实现首先我们来实现膨胀扩大函数。复制代码代码如下: var exploit=function(_ src,__size,__borderType,_ _ dst){ _ _ src | | error(参数。被叫方,IS _ UNDEFINED _ OR _ NULL/* { line } */);如果(_ src。键入_ _ src。type==' CV _ RGBA '){ var width=_ _ src。col,height=__src.row,size=__size || 3,dst=__dst || new Mat(height,width,CV _ RGBA),dst data=dst . datavar start=size 1;var带边框mat=复制制作边框(_ src,start,start,0,0,__borderType),mData=withBorderMat.data,mWidth=带边框mat。colvar newOffset,total,nowX,Offset,Offset ti,nowOffset,I,j;if(SIZE 1===0){ error(参数。calluer,EXPERT _ SIZE/* { line } */);(i=)的return _ _ src}高度;我-;){ offsetI=i *宽度;对于(j=宽度;j-;){新偏移量=0;total=0;for(y=大小;y-;){ offsecty=(y I)* mWidth * 4;对于(x=大小;x-;){ NoWx=(x j)* 4;now offset=offset nowX(mData[now offset]mData[now offset 1]mData[now offset 2]合计)(合计=mData[now offset]mData[now offset 1]mData[now offset 2])(新offset=now offset);} } DSDATa[(j offsetI)* 4]=MData[新偏移量];dst数据[(j偏移ti)* 4 1]=MData[新偏移1];dst数据[(j偏移量ti)* 4 ^ 2]=MData[新偏移量2];dst数据[(j偏移量ti)* 4 ^ 3]=MData[新偏移量3];} } } else { error(参数。调用者,EXPERT _ DATA _ TYPE/* { line } */);}返回dst };这行代码里面,我们先用RGB的数值和与上一个最大值总数对比,然后如果新的值比较大,就把新的值赋给总计,并把新的偏移量新偏移量赋值当前偏移量nowOffset。然后整个内核大小的面积循环完了就可以找到一个最大的总数以及对应的偏移量新偏移量。就可以赋值了:DsDATa[(j偏移量ti)* 4]=MData[新偏移量];dst数据[(j偏移ti)* 4 1]=MData[新偏移1];dst数据[(j偏移量ti)* 4 ^ 2]=MData[新偏移量2];dst数据[(j偏移量ti)* 4 ^ 3]=MData[新偏移量3];那么腐蚀腐蚀函数则相反,找一个最小的值就行了。复制代码代码如下:var erode=function(__src,__size,__borderType,_ _ dst){ _ _ src | | error(参数。被叫方,IS _ UNDEFINED _ OR _ NULL/* { line } */);如果(_ src。键入_ _ src。type==' CV _ RGBA '){ var width=_ _ src。col,height=__src.row,size=__size || 3,dst=__dst || new Mat(height,width,CV _ RGBA),dst data=dst . datavar start=size 1;var带边框mat=复制制作边框(_ src,start,start,0,0,__borderType),mData=withBorderMat.data,mWidth=带边框mat。colvar newOffset,total,nowX,Offset,Offset ti,nowOffset,I,j;if(SIZE 1===0){ error(参数。calluer,EXPERT _ SIZE/* { line } */);(i=)的return _ _ src}高度;我-;){ offsetI=i *宽度;对于(j=宽度;j-;){新偏移量=0;总计=765;for(y=大小;y-;){ offsecty=(y I)* mWidth * 4;对于(x=大小;x-;){ NoWx=(x j)* 4;now offset=offset nowX(mData[now offset]mData[now offset 1]mData[now offset 2]合计)(合计=mData[now offset]mData[now offset 1]mData[now offset 2])(新offset=now offset);} } DSDATa[(j offsetI)* 4]=MData[新偏移量];dst数据[(j偏移ti)* 4 1]=MData[新偏移1];dst数据[(j偏移量ti)* 4 ^ 2]=MData[新偏移量2];dst数据[(j偏移量ti)* 4 ^ 3]=MData[新偏移量3];} } } else { error(参数。调用者,EXPERT _ DATA _ TYPE/* { line } */);}返回dst };效果