Эффективный способ обнаружения белого фона в изображении

#python #python-3.x #algorithm #image #optimization

#python #python-3.x #алгоритм #изображение #оптимизация

Вопрос:

Я написал скрипт для определения, имеет ли изображение белый фон, путем суммирования всех белых пикселей и превышает ли он пороговый процент от общего количества пикселей.

Этот процесс занимает много времени и особенно много времени, если у меня много изображений. Есть ли более эффективный способ в numpy или opencv, который может это сделать, а не просто использовать параллельную обработку?

 def find_white_background(imgpath, threshold="0.3"):
    """remove images with transparent or white background"""
    imgArr = cv2.imread(imgpath)
    w, h, alpha = imgArr.shape

    total = w * h
    background = np.array([255, 255, 255])

    cnt = 0
    for row in imgArr:
        for pixel in row:
            if np.array_equal(pixel, background):
                cnt  = 1

    percent = cnt / total
    if percent >= threshold:
        return True
    else:
        return False
  

Комментарии:

1. Это не позволяет различать «правильный» фон и передний план с большим количеством белого. В качестве крайнего примера: является ли черно-белая шахматная доска белым фоном с черными квадратами или черным фоном с белыми квадратами?

2. я думаю, это нормально, поскольку вариант использования заключается в поиске изображений в Интернете для определенного объекта, и я не хочу, чтобы этот объект был на белом фоне, который эта логика может легко идентифицировать

Ответ №1:

Это должно обеспечить большую эффективность за счет одновременного сравнения всего массива с вашим массивом фоновых цветов вместо зацикливания.

 def find_white_background(imgpath, threshold=0.3):
    """remove images with transparent or white background"""
    imgArr = cv2.imread(imgpath)
    background = np.array([255, 255, 255])
    percent = (imgArr == background).sum() / imgArr.size
    if percent >= threshold:
        print(percent)
        return True
    else:
        return False