應用背景:在一些情況下,我們需要“增長”或者“粗化”二值圖像中的物體,初等形態學運算中的膨脹操作能實現這種目的。
基本原理:在形態學中,膨脹操作是腐蝕操作的逆運算,因此可以通過對原圖像的補集進行腐蝕來得到膨脹後的圖像。圖像A被結構元B膨脹用集合論來表示如下式:
其中,Ac爲A的補集。上式表示結構元對圖像A進行膨脹的結果集合是先將B相對原點旋轉180度得到-B,然後使用-B對Ac進行腐蝕,最後求補集。還可用D(A,B)表示膨脹。
膨脹操作的C++實現:
void Morphology::ImgDilation(unsigned char *imgBufIn,unsigned char *imgBufOut,int imgWidth,int imgHeight,
int *TempBuf, int TempW, int TempH)
{
int lineByte=(imgWidth+3)/4*4;
int i,j,k,l;
for(i=0;i<imgHeight;i++)
{
for(j=0;j<imgWidth;j++)
{
*(imgBufIn+i*lineByte+j)=255-*(imgBufIn+i*lineByte+j);
}
}
int *tempMask=new int[TempW*TempH];
for(k=0;k<TempH;k++)
{
for(l=0;l<TempW;l++)
{
tempMask[k*TempW+l]=TempBuf[(TempH-1-k)*TempW+TempW-1-l];
}
}
int flag;
for(i=TempH/2;i<imgHeight-TempH/2;i++)
{
for(j=TempW/2;j<imgWidth-TempW/2;j++)
{
flag=1;
for(k=-TempH/2;k<=TempH/2;k++)
{
for(l=-TempW/2;l<=TempW/2;l++)
{
if(tempMask[(k+TempH/2)*TempW+l+TempW/2])
{
if(!*(imgBufIn+(i+k)*lineByte+j+l))
flag=0;
}
}
}
if(flag)
*(imgBufOut+i*lineByte+j)=255;
else
*(imgBufOut+i*lineByte+j)=0;
}
}
for(i=0;i<imgHeight;i++)
{
for(j=0;j<imgWidth;j++)
{
*(imgBufOut+i*lineByte+j)=255-*(imgBufOut+i*lineByte+j);
}
}
for(i=0;i<imgHeight;i++
{
for(j=0;j<imgWidth;j++)
{
*(imgBufIn+i*lineByte+j)=255-*(imgBufIn+i*lineByte+j);
}
}
delete []tempMask;
}
運行結果:在VS中運行MFC多文檔程序,結果如下
膨脹前的lena圖像
膨脹後的lena圖像
從膨脹處理結果來看,圖像前景區域(白色部分)增大,邊界變得模糊。