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;
}
//
//
//
//
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;
}
解决方案 »
- 请教:vc2005的mfc应用程序读取word文档的内容如何做?
- HOOK CreateFile导致explorer崩溃的问题
- setup factory 打包的问题,关于路径
- 没有界面的com对象如何接收消息呀?
- 两台机器属于同一局域网内但不属于同一网关,利用SOCKET,能否直接连接?
- VC操作Oracle的问题,能成功连接,可当_RecordsetPtr的m_pRecordset的Open方法时总出错,具体程序请进来看,在线等,急急急!!!!!
- 求助深入浅出MFC问题
- 安装vc出现的问题
- 论现在学8086,8088汇编是否过时了
- 关于显示动画的ActiveX控件
- 怎样用配置文件连接数据库?
- MessageBox要点确定后,函数才能往下执行,怎么可以不这样?
/*************************************************************************
*
* 函数名称:
* 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;
}