求提取目标轮廓的方法

解决方案 »

  1.   

    方法很多,给你个最简单的,书上的
    /*************************************************************************
     *
     * 函数名称:
     *   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();
    }
      

  2.   

    算法很多,请问你具体要处理哪方面的图象,要得到什么结果?这样我可以推荐合适的算法。
    email: [email protected]