图像腐蚀,程序有点问题,请帮助解决……结构元素已经给出,程序没有出现需要的效果!

shuilongyin_00 2010-02-25 11:16:23
///***************************************************************/           
/*函数名称: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;
}
}


0为黑,1为白……
希望的是达到将
00
00
00
00
00
腐蚀为
01
01
01
01
01

但程序执行后为
01
01
00
00
00

希望高手帮助解决,详细指出错误所在……
...全文
221 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuilongyin_00 2010-02-26
  • 打赏
  • 举报
回复
测试用的图片格式不对!晕……
shuilongyin_00 2010-02-25
  • 打赏
  • 举报
回复
引用 9 楼 yzm888 的回复:
引用 6 楼 yzm888 的回复:楼主没有对内存越界做处理 (*(lpSrc + (1 - m) * wide +(n - 1) ) 边界内存越界了,
说错了,没看仔细

没关系的,帮我把程序修改正确就行了!呵呵……
谢谢……
验证码识别 2010-02-25
  • 打赏
  • 举报
回复
引用 6 楼 yzm888 的回复:
楼主没有对内存越界做处理

(*(lpSrc + (1 - m) * wide +(n - 1) )

边界内存越界了,

说错了,没看仔细
shuilongyin_00 2010-02-25
  • 打赏
  • 举报
回复
引用 6 楼 yzm888 的回复:
楼主没有对内存越界做处理

(*(lpSrc + (1 - m) * wide +(n - 1) )

边界内存越界了,

能帮着把程序修改下吗!我是现学现用,基本是啥都不太懂……
shuilongyin_00 2010-02-25
  • 打赏
  • 举报
回复
引用 2 楼 yzm888 的回复:
20是否小了点

这个明显是黑的


基本就是0 与255
所以,只是用20的限制!
验证码识别 2010-02-25
  • 打赏
  • 举报
回复
楼主没有对内存越界做处理

(*(lpSrc + (1 - m) * wide +(n - 1) )

边界内存越界了,
验证码识别 2010-02-25
  • 打赏
  • 举报
回复
引用 1 楼 shuilongyin_00 的回复:
纠正一下:
0为黑,1为白……
希望的是达到将
00
00
00
00
00
00
腐蚀为
01
01
01
01
01
00

但程序执行后为
01
01
00
00
00
00

望给出处理方法……


如果考虑图象边界(背景),假定为白(1)
楼主的要求可看为


1111 //上边界
1001
1001
1001
1001
1001
1111

腐蚀为
1111 //上边界
1011
1011
1011
1011
1011
1111

-------------
上面代码加上边界处理,就是这种效果了

Icedmilk 2010-02-25
  • 打赏
  • 举报
回复
腐蚀操作不可能达到你所说的效果
验证码识别 2010-02-25
  • 打赏
  • 举报
回复

if (*(lpSrc + (1 - m) * wide +(n - 1) ) > 200)

验证码识别 2010-02-25
  • 打赏
  • 举报
回复
20是否小了点

这个明显是黑的
shuilongyin_00 2010-02-25
  • 打赏
  • 举报
回复
纠正一下:
0为黑,1为白……
希望的是达到将
00
00
00
00
00
00
腐蚀为
01
01
01
01
01
00

但程序执行后为
01
01
00
00
00
00

望给出处理方法……
shuilongyin_00 2010-02-25
  • 打赏
  • 举报
回复
整理一下:
0为黑,1为白

结构元素为
00
00

腐蚀后为
01
11

厚着脸要代码了,望详细和完整,偶连菜都不如!
klkvc386 2010-02-25
  • 打赏
  • 举报
回复
UP............
sksgod 2010-02-25
  • 打赏
  • 举报
回复
引用 11 楼 icedmilk 的回复:
1111  //上边界
1001
1001
1001
1001
1001
1111
腐蚀为
1111  //上边界
1011
1011
1011
1011
1011
1111
只需要一个1*2的结构元素就可以了 [ 1 2 ]

而楼主想要的这种效果,通过腐蚀是达不到的
1111  //上边界
1011
1011
1011
1011
1001
1111

..
feixuedu1106 2010-02-25
  • 打赏
  • 举报
回复
顶!!!!!!!!!!!!!!!!
验证码识别 2010-02-25
  • 打赏
  • 举报
回复
楼主最好把问题描述清楚些

感觉程序并不能得到楼主给出的执行结果

但程序执行后为
01
01
00
00
00
Icedmilk 2010-02-25
  • 打赏
  • 举报
回复

if (*(lpSrc - m * wide + n) ) > 20)
shuilongyin_00 2010-02-25
  • 打赏
  • 举报
回复
引用 14 楼 icedmilk 的回复:
C/C++ code*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;
}

}
}
替换为
C/C++ code*lpDst= (*(lpSrc)>20||*(lpSrc+1)>20)?255 :0;

效果还是不对哈!

1111
1001
1001
1111
要腐蚀为
1111
1011
1111
1111
结构元素为
00
00

再帮忙下哈……
Icedmilk 2010-02-25
  • 打赏
  • 举报
回复

*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;
shuilongyin_00 2010-02-25
  • 打赏
  • 举报
回复
引用 5 楼 yzm888 的回复:

1111  //上边界
1001
1001
1001
1001
1001
1111

腐蚀为
1111  //上边界
1011
1011
1011
1011
1011
1111

-------------
感谢5楼的朋友哈!帮我表达清楚了……

望大家给出程序代码哈…… 自己厚着脸要代码了!
加载更多回复(2)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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