灰度图像腐蚀算法有谁懂的啊

astiger 2008-03-27 11:43:06
这是我的腐蚀函数:
void CMemDib::Erosion(int* mask, int masksize)
{
LPSTR lpSrc; // 指向源图像的指针
LPSTR lpDst; // 指向缓存图像的指针
LPSTR lpNewDIBBits; // 指向缓存DIB图像的指针
HLOCAL hNewDIBBits;
long i,j,n,m; //循环变量
unsigned char pixel; //像素值
long lWidth=m_width;
long lHeight=m_height;

// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
//if (hNewDIBBits == NULL)
//{
//return FALSE;
//}

lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth* lHeight);


//使用自定义的结构元素进行腐蚀
for(j = 1; j <lHeight-1; j++)
{
for(i = 1;i <lWidth-1; i++)
{
// 由于使用3×3的结构元素,为防止越界,所以不处理最左边和最右边
// 的两列像素和最上边和最下边的两列像素

// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)m_pMemBuf + 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;
*(lpDst + 1)= (unsigned char)0;
*(lpDst + 2)= (unsigned char)0;

//如果原图像中对应结构元素中为黑色的那些点中有一个不是黑色,
//则将目标图像中的当前点赋成白色
//注意在DIB图像中内容是上下倒置的
for (m = 0;m < 3;m++ )
{
for (n = 0;n < 3;n++)
{
if(mask[m * 3 + n] == 5)
continue;
pixel = *(lpSrc + (1 - m) * lWidth +(n - 1));
if (pixel >128 )
{
*lpDst = (unsigned char)255;
*(lpDst + 1)= (unsigned char)255;
*(lpDst + 2)= (unsigned char)255;
break;
}
}
}
}
}

// 复制腐蚀后的图像
memcpy(m_pMemBuf, lpNewDIBBits, lWidth* lHeight);

LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);

}
我对一幅256色的灰度图象处理后感觉就变成了二值图像,腐蚀后的效果应该不是这样的吧?怎样改才好呢?
我的结构元素是int m[9] = {5,5,5,5,10,5,5,5,5};
...全文
560 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
pupu_2009 2010-12-05
  • 打赏
  • 举报
回复
楼主你这个是二值的算法,灰度的是算领域中的最小值,领域由结构元素决定。
one2zero 2010-03-11
  • 打赏
  • 举报
回复
不了解 图形图像 哎
帮顶
charlesfaw 2010-03-11
  • 打赏
  • 举报
回复
额……你的算法中貌似所有像素点要不是0 要不是255……肯定会成类似2值图像了……腐蚀是将原图对应结构元素位置的像素与结构元素相减后取最大值,然后吧最大值赋给当前像素~

64,849

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧