#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