Чаще всего используется алгоритм Flood Fill. Ниже приведена наивная версия из моего старого университетского учебника «Компьютерная графика с OpenGL» Хирна Бейкера, 3-е изд:
void floodFill4 (int x, int y, int fillColor, int interiorColor)
{
int color;
/* Set current color to fillColor, then perform the following operations */
getPixel(x, y, color);
if (color == interiorColor)
{
setPixel(x,y); // Set color of pixel to fillColor.
floodFill4(x + 1, y, fillColor, interiorColor);
floodFill4(x - 1, y, fillColor, interiorColor);
floodFill4(x, y + 1, fillColor, interiorColor);
floodFill4(x, y - 1, fillColor, interiorColor);
}
}
Однако для больших изображений приведенное выше, вероятно, даст вам ошибку переполнения стека из-за повторения для каждого пикселя. Часто этот алгоритм модифицируется так, что он использует итерацию при заполнении строки пикселями, а затем рекурсивно заполняет строки сверху и снизу. Как сказал @kasperjj, в Википедии есть хорошая статья на эту тему.