MS VC 6 数学形态学 执行腐蚀操作 程序好像有问题,请高人指点 __________ __________ __________ __________
//
//
//
//
int CMonPro::__MonErosion(int *nMask, int nMaskLen)
{
int nX, nY, nZ;
int nI, nMIndex;

// 特征表 --> 临时表
int* _pTempMonCharacter = new int[_MonCount];
memcpy( _pTempMonCharacter, _pMonCharacter, sizeof(int) * _MonCount );

// 执行腐蚀操作
for ( nY = 0; nY < _MonYCount; nY++ )
{
for ( nX = 0; nX < _MonXCount; nX++ )
{
nZ = nY * _MonXCount + nX;
if ( _pMonCharacter[nZ] != 1 ) // □
{
for ( nI = 0; nI < nMaskLen; nI++ )
{
nMIndex = (nY + nMask[2 * nI + 1]) * _MonXCount + ( nX + nMask[2 * nI] );
if ( ( nX + nMask[2 * nI] >= 0 ) && 
( nX + nMask[2 * nI] < _MonXCount ) &&
( nY + nMask[2 * nI + 1] >= 0 ) && 
( nY + nMask[2 * nI + 1] < _MonYCount ) )
{
if ( _pMonCharacter[nMIndex] == 1 ) // □

_pTempMonCharacter[nZ] = 1; // □
break;
}
}
else // 越界处理
{
_pTempMonCharacter[nZ] = 1; // □
break;
}
}
}
}
}

// 临时表 --> 特征表
memcpy( _pMonCharacter, _pTempMonCharacter, sizeof(int) * _MonCount );
delete [] _pTempMonCharacter;
_pTempMonCharacter=NULL;

return 1;
}

解决方案 »

  1.   

    给你贴一段^_^
    /*************************************************************************
     *
     * 函数名称:
     *   ErosiontionDIB()
     *
     * 参数:
     *   LPSTR lpDIBBits    - 指向源DIB图像指针
     *   LONG  lWidth       - 源图像宽度(象素数,必须是4的倍数)
     *   LONG  lHeight      - 源图像高度(象素数)
     *   int   nMode - 腐蚀方式,0表示水平方向,1表示垂直方向,2表示自定义结构元素。
     *  int   structure[3][3]
    - 自定义的3×3结构元素。
     *
     * 返回值:
     *   BOOL               - 腐蚀成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行腐蚀运算。结构元素为水平方向或垂直方向的三个点,中间点位于原点;
     * 或者由用户自己定义3×3的结构元素。
     * 
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/BOOL WINAPI ErosionDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, int nMode , int structure[3][3])
    {

    // 指向源图像的指针
    LPSTR lpSrc;

    // 指向缓存图像的指针
    LPSTR lpDst;

    // 指向缓存DIB图像的指针
    LPSTR lpNewDIBBits;
    HLOCAL hNewDIBBits; //循环变量
    long i;
    long j;
    int  n;
    int  m; //像素值
    unsigned char pixel; // 暂时分配内存,以保存新图像
    hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight); if (hNewDIBBits == NULL)
    {
    // 分配内存失败
    return FALSE;
    }

    // 锁定内存
    lpNewDIBBits = (char * )LocalLock(hNewDIBBits); // 初始化新分配的内存,设定初始值为255
    lpDst = (char *)lpNewDIBBits;
    memset(lpDst, (BYTE)255, lWidth * lHeight);
    if(nMode == 0)
    {
    //使用水平方向的结构元素进行腐蚀
    for(j = 0; j <lHeight; j++)
    {
    for(i = 1;i <lWidth-1; i++)
    {
    //由于使用1×3的结构元素,为防止越界,所以不处理最左边和最右边的两列像素 // 指向源图像倒数第j行,第i个象素的指针
    lpSrc = (char *)lpDIBBits + lWidth * j + i; // 指向目标图像倒数第j行,第i个象素的指针
    lpDst = (char *)lpNewDIBBits + lWidth * j + i; //取得当前指针处的像素值,注意要转换为unsigned char型
    pixel = (unsigned char)*lpSrc; //目标图像中含有0和255外的其它灰度值
    if(pixel != 255 && *lpSrc != 0)
    return FALSE;

    //目标图像中的当前点先赋成黑色
    *lpDst = (unsigned char)0; //如果源图像中当前点自身或者左右有一个点不是黑色,
    //则将目标图像中的当前点赋成白色
    for (n = 0;n < 3;n++ )
    {
    pixel = *(lpSrc+n-1);
    if (pixel == 255 )
    {
    *lpDst = (unsigned char)255;
    break;
    }
    }

    }
    } }
    else if(nMode == 1)
    {
    //使用垂直方向的结构元素进行腐蚀
    for(j = 1; j <lHeight-1; j++)
    {
    for(i = 0;i <lWidth; i++)
    {
    //由于使用1×3的结构元素,为防止越界,所以不处理最上边和最下边的两列像素 // 指向源图像倒数第j行,第i个象素的指针
    lpSrc = (char *)lpDIBBits + lWidth * j + i; // 指向目标图像倒数第j行,第i个象素的指针
    lpDst = (char *)lpNewDIBBits + lWidth * j + i; //取得当前指针处的像素值,注意要转换为unsigned char型
    pixel = (unsigned char)*lpSrc; //目标图像中含有0和255外的其它灰度值
    if(pixel != 255 && *lpSrc != 0)
    return FALSE; //目标图像中的当前点先赋成黑色
    *lpDst = (unsigned char)0; //如果源图像中当前点自身或者上下有一个点不是黑色,
    //则将目标图像中的当前点赋成白色
    for (n = 0;n < 3;n++ )
    {
    pixel = *(lpSrc+(n-1)*lWidth);
    if (pixel == 255 )
    {
    *lpDst = (unsigned char)255;
    break;
    }
    }

    }
    } }
    else
    {
    //使用自定义的结构元素进行腐蚀
    for(j = 1; j <lHeight-1; j++)
    {
    for(i = 0;i <lWidth; i++)
    {
    //由于使用3×3的结构元素,为防止越界,所以不处理最左边和最右边的两列像素
    //和最上边和最下边的两列像素
    // 指向源图像倒数第j行,第i个象素的指针
    lpSrc = (char *)lpDIBBits + lWidth * j + i; // 指向目标图像倒数第j行,第i个象素的指针
    lpDst = (char *)lpNewDIBBits + lWidth * j + i; //取得当前指针处的像素值,注意要转换为unsigned char型
    pixel = (unsigned char)*lpSrc; //目标图像中含有0和255外的其它灰度值
    if(pixel != 255 && *lpSrc != 0)
    return FALSE; //目标图像中的当前点先赋成黑色
    *lpDst = (unsigned char)0; //如果原图像中对应结构元素中为黑色的那些点中有一个不是黑色,
    //则将目标图像中的当前点赋成白色
    //注意在DIB图像中内容是上下倒置的
    for (m = 0;m < 3;m++ )
    {
    for (n = 0;n < 3;n++)
    {
    if( structure[m][n] == -1)
    continue;
    pixel = *(lpSrc + ((2-m)-1)*lWidth + (n-1));
    if (pixel == 255 )
    {
    *lpDst = (unsigned char)255;
    break;
    }
    }
    }

    }
    } }
    // 复制腐蚀后的图像
    memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight); // 释放内存
    LocalUnlock(hNewDIBBits);
    LocalFree(hNewDIBBits); // 返回
    return TRUE;
    }