二值圖像的膨脹操作及c++實現

應用背景:在一些情況下,我們需要“增長”或者“粗化”二值圖像中的物體,初等形態學運算中的膨脹操作能實現這種目的。

基本原理:在形態學中,膨脹操作是腐蝕操作的逆運算,因此可以通過對原圖像的補集進行腐蝕來得到膨脹後的圖像。圖像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圖像


從膨脹處理結果來看,圖像前景區域(白色部分)增大,邊界變得模糊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章