求提取目标轮廓的方法

sy95122 2003-01-20 11:32:51
求提取目标轮廓的方法
...全文
76 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hacking 2003-01-21
  • 打赏
  • 举报
回复
有好多的
sunny71 2003-01-21
  • 打赏
  • 举报
回复
算法很多,请问你具体要处理哪方面的图象,要得到什么结果?这样我可以推荐合适的算法。
email: zuoxd@yahoo.com.cn
firebolt2002 2003-01-21
  • 打赏
  • 举报
回复
方法很多,给你个最简单的,书上的
/*************************************************************************
*
* 函数名称:
* Roberts()
*
* 参数:
* HDIB hDIB - 待处理的DIB
*
* 返回值:
* void - 无返回值
*
* 说明:
* 对图像进行罗伯特交叉算子的边缘检测
*
************************************************************************/

void CSplitProc::Roberts(HDIB hDIB)
{
// 循环变量
LONG i;
LONG j;
LONG k;
LONG l;

// 指向DIB的指针
LPBYTE lpDIB;

// 指向DIB象素指针
LPBYTE lpDIBBits;

// 锁定DIB
lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);

// 找到DIB图像象素起始位置
lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);

// 判断是否是24-bpp位图
if (m_clsDIB.DIBBitCount(lpDIB) != 24)
{
// 提示用户
MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);

// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);

// 返回
return;
}

// 更改光标形状
BeginWaitCursor();

// DIB的宽度
LONG lWidth = m_clsDIB.DIBWidth(lpDIB);

// DIB的高度
LONG lHeight = m_clsDIB.DIBHeight(lpDIB);

// 计算图像每行的字节数
LONG lLineBytes = WIDTHBYTES(lWidth * 24);

// 不能用char,也不能用::strcpy()
unsigned char* m_temp;
m_temp = new unsigned char [lLineBytes * lHeight];

// 中间变量
int v_r_v, v_g_v, v_b_v, g_v;
int v_r_h, v_g_h, v_b_h, g_h;

// 复制图象数据到中间缓存
for (i = 0; i < lLineBytes * lHeight; i++)
m_temp[i] = *(lpDIBBits + i);

// 2X2 模版
for (i = 0; i < lWidth; i++) //被处理像素在i列
{
for (j = 0; j < lHeight; j++) //被处理像素在j行
{
v_r_v = v_g_v = v_b_v = v_r_h = v_g_h = v_b_h = 0;

for (k = i - 1; k < i + 1; k++) //2*2模版
{
for (l = j - 1; l < j + 1; l++)
{
// 防止内存溢出
if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
{
// 检测模版
if (k == i - 1 && l == j - 1)
g_v = 1;
else if (k == i && l == j)
g_v = -1;
else
g_v = 0;

if(k == i - 1 && l == j)
g_h = -1;
else if (k == i && l == j - 1)
g_h = 1;
else
g_h = 0;

v_r_v += *(lpDIBBits + l * lLineBytes + k * 3) * g_v;
v_r_h += *(lpDIBBits + l * lLineBytes + k * 3) * g_h;
v_g_v += *(lpDIBBits + l * lLineBytes + k * 3 + 1) * g_v;
v_g_h += *(lpDIBBits + l * lLineBytes + k * 3 + 1) * g_h;
v_b_v += *(lpDIBBits + l * lLineBytes + k * 3 + 2) * g_v;
v_b_h += *(lpDIBBits + l * lLineBytes + k * 3 + 2) * g_h;
}
}
}
m_temp[j * lLineBytes + i * 3] = (int)sqrt(v_r_v * v_r_v + v_r_h * v_r_h);
m_temp[j * lLineBytes + i * 3 + 1] = (int)sqrt(v_g_v * v_g_v + v_g_h * v_g_h);
m_temp[j * lLineBytes + i * 3 + 2] = (int)sqrt(v_b_v * v_b_v + v_b_h * v_b_h);
}
}

// 回存处理结果到DIB
for(i = 0; i < lLineBytes * lHeight; i++)
*(lpDIBBits + i) = m_temp[i];

// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);

// 释放内存
delete[] m_temp;

// 恢复光标
EndWaitCursor();
}

19,468

社区成员

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

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