我是 C++ 的初学者,在学习递归时无法理解斑点着色的结果



结果表明

<Original image>
.................
.9999...9.....9..
99....99999.99999
.9999...9.....9..
<Labelled image>
.................
.1111...2.....3..
11....22222.33333
.1111...2.....3..

像这样。

我能理解原始图像,但不能标记图像。我的意思是应该全部是3吗?不包括1,2。实际上,我不太理解我刚刚命名的标签函数

代码

#include <cstdio>
#define WIDTH 17
#define HEIGHT 5
void label(unsigned char img[HEIGHT][WIDTH], int x, int y, int color)
{
if (x < 0 || y < 0 || x >= WIDTH || y >= HEIGHT || img[y][x] != 9)
return;
img[y][x] = color;
label(img, x-1, y, color);
label(img, x, y-1, color);
label(img, x+1, y, color);
label(img, x, y+1, color);
}
void blobColoring(unsigned char img[HEIGHT][WIDTH])
{
int color = 1;
for (int y = 0; y < HEIGHT; y++)
for (int x = 0; x < WIDTH; x++)
{
if (img[y][x] == 9)
label(img, x, y, color++);
}
}
void printImage(unsigned char img[HEIGHT][WIDTH], char *msg)
{
printf("%sn", msg);
for (int y = 0; y < HEIGHT; y++)
{
for(int x =0; x<WIDTH; x++)
{
if (img[y][x] == 0) printf(".");
else printf("%d", img[y][x]);
}
printf("n");
}
printf("n");
}
void main()
{
unsigned char image[HEIGHT][WIDTH] =
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,
9,9,0,0,0,0,9,9,9,9,9,0,9,9,9,9,9,
0,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
printImage(image, "<Original image>");
blobColoring(image);
printImage(image, "<Labelled image>");
}

函数blobColoring()有一个双循环,它扫描您的图像以查找值9,这似乎是"自由像素";价值当找到时,递归函数label()用从1开始并递增的给定颜色填充所有相邻的9个像素,因此第一个找到的9个区域变成1,第二个变成2,第三个变成3。由于递归,只要邻居等的所有邻居在矩形中并且颜色为9,它们就会被遍历。

请注意,您的结果(输入和输出:C++(看起来不错,但与源代码中的图像(C-(不匹配。此外,更改图像,使中间区域成为顶行中的一个像素,并查看结果如何更改。

此外,在label()函数中放置一个断点,以查看变量的变化情况。

相关内容

  • 没有找到相关文章

最新更新