Попробовал с помощью Dilating и Открытие вашего результирующего изображения с этим результатом (ваше будет выглядеть еще лучше с необработанными данными)
Изображение результата
Я думаю, что это «простой метод» для его решения, в противном случае вы должны использовать более точный подход ИИ. Вот код. Вы можете отображать изображения во время процесса, чтобы понять каждый шаг.
import cv2
import numpy as np
THRESHOLD = 10
DILATE_SIZE = 16
OPEN_SIZE = 47
img = cv2.imread("roofs.jpg", -1)
#using red channel - roofs ar
red_channel = img[:, :, 2]
# kernels
kernel_dil = np.ones([DILATE_SIZE,DILATE_SIZE])
kernel_er = np.ones([OPEN_SIZE,OPEN_SIZE])
# threshold
(t, img_bin) = cv2.threshold(red_channel, THRESHOLD, 255, cv2.THRESH_BINARY_INV)
img_bin = cv2.morphologyEx(img_bin,cv2.MORPH_DILATE,kernel_dil)
img_bin = cv2.morphologyEx(img_bin,cv2.MORPH_OPEN,kernel_er)
# to show result only
img_res = img
img_res[:,:,1] = img_bin[:,:]
cv2.imshow("img",img_res)
cv2.waitKey(0)
cv2.imwrite("res.jpg",img_res)