gpt4 book ai didi

c++ - 洪水填充C++

转载 作者:太空狗 更新时间:2023-10-29 21:27:52 25 4
gpt4 key购买 nike

我在实现洪水填充时遇到问题。
任务是要求用户点击图像的白色部分(表示种子点),他想用黑色填充。
操作应该在二值图像上完成。
我用的是CImg图书馆。
不能使用递归算法。
我想出了一些办法,但它不能正常工作(间隙只在种子点处变黑)。我根本不熟悉队列,所以问题可能出在它们的实现上。

void floodfill(int x, int y, int c, int b, CImg <unsigned char>image)
{
//c-black
//b-white
CImg<unsigned char> kopia(image.width(),image.height());

for (int p=1; p<image.height()-1; p++)
{
for (int q=1; q<image.width()-1; q++)
{
kopia(p,q)=255; //setting kopia2 all white
}
}

queue <pair<int,int> > a;
int p;
if(image(x, y) == c)
{
cout<<"Already black"<<endl;
return;
}
else
{
a.push(make_pair(x, y));
while(!a.empty())
{
a.pop();
p=image(x+1, y);
if((p == b) && (x < image.width()))
{
a.push(make_pair(x+1, y));
kopia(x+1, y)=c;
image(x+1, y)=c;
}
p = image(x-1, y);
if((p == c) && (x > 0))
{
a.push(make_pair(x-1, y));
kopia(x-1, y)=c;
image(x-1, y)=c;
}
p=image(x, y+1);
if((p == b) && (y < image.height()))
{
a.push(make_pair(x, y+1));
kopia(x, y+1)=c;
image(x, y+1)=c;
}
p=image(x, y-1);
if((p == b) && (y > 0))
{
a.push(make_pair(x, y-1));
kopia(x, y-1)=c;
image(x, y-1)=c;
}
}
saving(kopia);
}
}

void hole (CImg <unsigned char>image)
{
CImgDisplay image_disp(image,"Click a point");

int c_x=0; //coordinates
int c_y=0;

while (!image_disp.is_closed())
{
image_disp.wait();
if (image_disp.button())
{
c_x=image_disp.mouse_x(); //reads coordinates indicated by user
c_y=image_disp.mouse_y();
}
}

floodfill(c_x, c_y,0,255,image);
}

最佳答案

1)

    while(!a.empty())
{
x = a.front().first; //fixed as per ChristianRau's code
y = a.front().second; //fixed as per ChristianRau's code
a.pop();

您只是将当前的 x,y 坐标从堆栈中弹出,而没有查看它们是什么。

2)

        p = image(x-1, y);
if((p == c) && (x > 0))

您的意思是要检查它是否是白色的,就像您对其他方向所做的那样?

3) 调用者传入的是黑白图像,如果图像的一部分是蓝色的怎么办?更好的方法是传入填充颜色(黑色),并且在任何有白色的地方,将其替换为非黑色。

关于c++ - 洪水填充C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8319485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com