//-------------------------------------------【腐蚀和膨胀的理解】---------------------------------------------------
//1--腐蚀--随着--腐蚀结构元素--的增大,小于结构元素的物体相继消失(被置为白色)
//2--所以说---腐蚀--可以滤波,选择适当大小和形状的结构元素,可以滤掉所有不能完全包含--结构元素的--噪声点
//3--腐蚀的缺点---在出去噪声的同时,对图像中的前景物体的形状也会有影响
//
//4--膨胀--常常用于将---原本断裂开来的同一物体桥接起来
//-----------------------------------------------------------------------------------------------------------------
/******************************************************************************************************************
*函数原型:void CImgProcess::Dilate(CImgProcess* pTo,int se[3][3])
*函数功能:3*3--结构元素的二值图像的--膨胀,只能处理二值图像
*参数:CImgProcess* pTo-------输出目标图像
* se[3][3]-----3*3的结构元素,其数组元素的合法取值为:
* 1---前景
* -1--不关系
*函数返回值:无
********************************************************************************************************************/
void CImgProcess::Dilate(CImgProcess* pTo,int se[3][3])
{
int nHeight=GetHeight();
int nWidth=GetWidthPixel();
//[1]图像的循环变量
int i,j;
//[2]结构元素的循环变量
int k,l;
//[3]计算se关于中心的对称集
int nTmp;
for(i=0;i<2;i++)
{
for(j=0;j<3-i;j++)
{
nTmp=se[i][j];
se[i][j]=se[2-i][2-j];
se[2-i][2-j]=nTmp;
}//j
}//i
//[4]清空目标输出的图像
pTo->InitPixels(255);
//[5]逐行扫描图像,为防止访问越界,四周留出一个像素宽的空边
for(i=1;i<nHeight-1;i++)
{
for(j=1;j<nWidth-1;j++)
{
//[6]由于使用的是3*3的结构元素,为防止越界,不处理最上和最下的两行像素,以及最左和最右的两列像素
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
if(se[k][l]==-1)//不关心
continue;
if(se[k][l]==1)
{
if(GetGray(j-1+l,i-1+k)==0)
{
//[7]原图像中对应结构元素的局部区域有一点为1,就将目标图像对应于结构元素中心的像素置为0
pTo->SetPixel(j,i,RGB(0,0,0));
break;
}
}
else{
AfxMessageBox("结构元素含有非法值!强检查后,重新设置");
return;
}
}//l
}//k
}//j
}//i
}