Весь код:

у использовать функцию cv2.connectedComponents для соединения компонентов в двоичном образе, как показано ниже ...

Я добавил эту функцию в cv2. connectedComponents для устранения элементов с небольшим количеством пикселей.

К сожалению, алгоритм очень медленный для больших изображений из-за расширения. Есть ли способ переписать расширение, чтобы ускорить алгоритм?

import cv2
import numpy as np

def zerolistmaker(n):
    listofzeros = [0] * n
    return listofzeros


img = cv2.imread('files/motorway/gabor/eGaIy.jpg', 0)

img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  # ensure binary
retval, labels = cv2.connectedComponents(img)

##################################################
# ENLARGEMENT
##################################################
sorted_labels = labels.ravel()
sorted_labels = np.sort(sorted_labels)


maxPixel = 50  # eliminate elements with less than maxPixel

# detect how often an element occurs
i=0
counter=0
counterlist = zerolistmaker(retval)

while i < len(sorted_labels):
    if sorted_labels[i] == counter:
        counterlist[counter] = counterlist[counter] + 1
    else:
        counter = counter + 1
        i = i - 1

    i = i + 1


# delete small pixel values
i=0
while i < len(counterlist):
    if counterlist[i] < maxPixel:
        counterlist[i] = 0
    i = i + 1

i=0
counterlisthelper = []
while i < len(counterlist):
    if counterlist[i] == 0:
        counterlisthelper.append(i)
    i = i + 1

i=0
j=0
k=0
while k < len(counterlisthelper):
    while i < labels.shape[0]:
        while j < labels.shape[1]:
            if labels[i,j] == counterlisthelper[k]:
                labels[i,j] = 0
            else:
                labels[i,j] = labels[i,j]
            j = j + 1
        j = 0
        i = i + 1
    i = 0
    j = 0
    k = k + 1

##################################################
##################################################

# Map component labels to hue val
label_hue = np.uint8(179*labels/np.max(labels))
blank_ch = 255*np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])

# cvt to BGR for display
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)

# set bg label to black
labeled_img[label_hue==0] = 0

cv2.imshow('labeled.png', labeled_img)
cv2.waitKey()

Ответы на вопрос(1)

Ваш ответ на вопрос