visualc++洪水填充图像递归算法错误

visual c++ flood fill image recursive algorithm error

本文关键字:递归算法 错误 图像 填充 visualc++      更新时间:2023-10-16

我正在编写一个泛洪填充方法,用红色填充图像(狗的轮廓)。

在我的TestShellDlg.cpp中,是泛洪填充方法。CTestShellDlg::m_pScreenDb成员是一个包含图形并绘制图形的CDIB32位图类。

我想对当前像素进行采样,如果它不是黑色(轮廓的颜色),则将其染成红色。这是Dib3.cpp类中预先构建的getter:

void CDIB32::GetRGB(int x, int y, BYTE& r, BYTE& g, BYTE& b)
{
    if (x >= Width() || y >= Height())
        IERROR;
    int off = y * ByteWid() + x * 4;
    b = m_pBits[off];
    g = m_pBits[off+1];
    r = m_pBits[off+2];
}

下面是我在TestShellDlg.cpp类中的floodfill方法:

void CTestShellDlg::FloodFill(CPoint& mid)
{
    byte r,g,b;
    //while the current pixel colour is not black, set it to red and recursively loop
    m_pScreenDib ->GetRGB(mid.x,mid.y, (byte) r,(byte) g,(byte)b);
        while(r !=(byte)0, g !=(byte)0, b !=(byte)0)
        {
            m_pScreenDib -> SetRGB(mid.x, mid.y,(byte)255,(byte) 0,(byte) 0);
            mid.x++;
            FloodFill(mid);
            mid.x--;
            FloodFill(mid);
            mid.y++;
            FloodFill(mid);
            mid.y--;
            FloodFill(mid);
        }
}

在构建和运行项目时,我在GetRGB()函数中的IERROR处获得了一个断点。

在堆栈中工作时,这种情况发生在x.x中期——经过几次运行之后。该程序似乎从未进入过中.y++.

我也尝试过将此作为我的停止条件:

while(mid.x < m_pScreenDib ->Width() && mid.y < m_pScreenDib -> Height())

具有相同的结果。

蜂箱里的任何人都能提供原因和可能的解决方案吗?非常感谢大家。

有几个问题。先解决这些问题,看看会发生什么:

  1. 您正在递归调用FloodFill,而rgb并不都等于0。但是,您不会在while循环中更新这些值中的任何一个。那会给你一个无尽的循环。

  2. 另一个问题是:

        mid.x++;
        FloodFill(mid);
        mid.x--;
        FloodFill(mid);
    

    设x为100。在mid.x++之后,x将是101。然后执行x--,使x再次为100。所以你用相同的x值递归调用FloodFill()。我不认为这是你想要的。

  3. FloodFill中,在再次调用FloodFill之前递增x。但您不会检查是否已到达图像的右边界,因此FloodFill将被递归调用,x的值会越来越大,直到您获得堆栈溢出、访问冲突,或者由于整数溢出(无论先发生什么),x被设置为0 agein。