robert算子做边缘提取

钱塘民工 2008-03-14 04:16:25
bool CDib::Robert()
{
long i,j;//设置循环变量
long Height,Width;//位图的高度,宽度
Height=DibHeight();//获得位图高度
Width=DibWidth();//获得宽度
unsigned char pixel[4];
double result;
for(j=Height-1;j>0;j--)
{
for(i=0;i<Width-1;i++)
{ m_pDibBits=m_pDibBits+Width*j+i;//指向源图像的第j行,第i个像素的指针
pixel[0]=(unsigned char)*m_pDibBits;
pixel[1]=(unsigned char)*(m_pDibBits+1);
pixel[2]=(unsigned char)*(m_pDibBits-Width);
pixel[3]=(unsigned char)*(m_pDibBits-Width+1);
result=sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])+
(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
*m_pDibBits=(unsigned char)result;

}
}
return true;
}
运行时程序崩溃,不知道怎么回事
...全文
258 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
钱塘民工 2008-03-14
  • 打赏
  • 举报
回复
非常感谢DRACULAX05
但是我还有个问题问一下,为什么声明一个临时变量BYTE* pTemp = NULL;

就使得程序正常运行了呢?
laoma_hbu 2008-03-14
  • 打赏
  • 举报
回复
因为BMP位图要求每行为4的整数倍字节,所以
Width是指图像宽度还是指图像一行数据所占的字节数要分清楚;
用作循环控制的肯定是指图像的宽度,而m_pDibBits+Width*j+i; 中的Width应该为图像一行数据所占的字节数
DRACULAX05 2008-03-14
  • 打赏
  • 举报
回复

bool CDib::Robert()
{
long i,j;//设置循环变量
long Height,Width;//位图的高度,宽度

Height = DibHeight(); // 获得位图高度
Width = DibWidth(); // 获得宽度
unsigned char pixel[4];
double result;

BYTE* pTemp = NULL;

for(j=Height-1;j> 0;j--)
{
for(i=1;i <Width-1;i++)
{
pTemp = m_pDibBits+Width*j+i; //指向源图像的第j行,第i个像素的指针

pixel[0]=(unsigned char)*pTemp ;
pixel[1]=(unsigned char)*(pTemp + 1);
pixel[2]=(unsigned char)*(pTemp-Width);
pixel[3]=(unsigned char)*(pTemp-Width+1);

result = sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])+
(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));

*pTemp = (unsigned char)result;
}
}

return true;
}
钱塘民工 2008-03-14
  • 打赏
  • 举报
回复
应当如何改啊?
DRACULAX05 2008-03-14
  • 打赏
  • 举报
回复
m_pDibBits=m_pDibBits+Width*j+i;这句错了,加几次肯定就越界了

19,466

社区成员

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

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