есть кривоватый алгоритм поиска связных областей... перебирая пиксели картинки возможно 4 случая:
if (image -> pixel(x - 1, y - 1) == qRgb(0, 0, 0)) //граница, условно черного цвета
continue;//areas[x][y] = 0;
else if (areas[x][y - 1] == 0 && areas[x - 1][y] == 0)
areas[x][y] = ++curarea;
else if (areas[x][y - 1] != 0 && areas[x - 1][y] == 0)
areas[x][y] = areas[x][y - 1];
else if (areas[x][y - 1] == 0 && areas[x - 1][y] != 0)
areas[x][y] = areas[x - 1][y];
else if (areas[x][y - 1] != 0 && areas[x - 1][y] != 0)
в последнем случае - коллизия 2х уже заполненных областей и их нужно склеить в одну. Алгоритм простой, но медленный.