19,468
社区成员
发帖
与我相关
我的任务
分享
///***************************************************************/
/*函数名称:Quanfangxiangfushi()
/*函数类型:void
/*功能:对图像进行腐蚀。
/***************************************************************/
void JiHeBianHuanDib::Quanfangxiangfushi()
{
// 指向DIB象素指针
LPBYTE p_data;
// 指向源图像的指针
LPBYTE lpSrc;
// 指向缓存图像的指针
LPBYTE lpDst;
// 指向缓存DIB图像的指针
LPBYTE temp;
//循环变量
int i;
int j;
int m;
int n;
// 找到DIB图像象素起始位置
p_data = GetData();
// DIB的宽度
LONG wide= GetWidth();
// DIB的高度
LONG height =GetHeight();
if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
{
// 暂时分配内存,以保存新图像
temp =new BYTE[wide*height];
// 初始化新分配的内存,设定初始值为255
lpDst = (LPBYTE)temp;
memset(lpDst, (BYTE)255, wide * height);
// 2×2的结构元素
int B[4] = {0, 0,
0, 0};
// 使用结构元素进行腐蚀
for (j = 1; j < height - 1; j++)
{
for (i = 1; i < wide - 1; i++)
{
// 由于使用2×2的结构元素,防止越界,所以不处理最左、右、上、下四边的像素
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (unsigned char *)(p_data + wide * j + i);
// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (unsigned char *)(temp + wide * j + i);
// 目标图像中的当前点先赋成黑色
*lpDst = 0;
// 如果源图像中2×2结构元素对应位置有白点
// 则将目标图像中的(0,0)点赋成白色
for (m = 0; m < 2; m++)
{
for (n = 0; n < 2; n++)
{
if (*(lpSrc + (1 - m) * wide +(n - 1) ) > 20)
{
*lpDst = 255;
break;
}
}
}
}
}
// 复制腐蚀后的图像
memcpy(p_data, temp, wide * height);
// 释放内存
delete temp;
}
}
if (*(lpSrc + (1 - m) * wide +(n - 1) ) > 200)
if (*(lpSrc - m * wide + n) ) > 20)
*lpDst = 0;
// 如果源图像中2×2结构元素对应位置有白点
// 则将目标图像中的(0,0)点赋成白色
for (m = 0; m < 2; m++)
{
for (n = 0; n < 2; n++)
{
if (*(lpSrc + (1 - m) * wide +(n - 1) ) > 20)
{
*lpDst = 255;
break;
}
}
}
*lpDst = (*(lpSrc) > 20 || *(lpSrc + 1) > 20) ? 255 : 0;