Я создаю веб-приложение, которое требует "обнаружения" одежды по изображению с белым фоном (или, по крайней мере, по фону с некоторой контрастностью).
У меня есть следующая функция, которая должназаменить все пиксели на белые пиксели в изображении, которые отличаются более чем на 70% от пикселя в центре изображения с точки зрения их значения RGB.
def crop(self, image_data):
'''"Crops" image by changing all RGB values to [255, 255, 255] if they differ more than
70% from the pixel in the center of the image.
'''
image_data.setflags(write=1)
height, width, channels = image_data.shape
new_image_data = np.full((height, width, 3), 255)
middle_pixel = image_data[(height // 2), (width // 2)]
middle_pixel_avg = np.mean(middle_pixel)
difference_limit = middle_pixel_avg * 0.7
for row in range(height):
for col in range(width):
pixel_avg = np.mean(image_data[row, col])
if (abs(middle_pixel_avg - pixel_avg) <= difference_limit):
new_image_data[row, col] = image_data[row, col]
return new_image_data
Это крайне неэффективно и занимает около 30 секунд.работать на обычном изображении, снятом на iPhone.Это также отвратительно и кажется совершенно неправильным способом определения фона изображения.
Я хотел бы, прежде всего, знать, как сделать эту функцию более эффективной.Во-вторых, я хотел бы знать, есть ли лучшие и более надежные способы сделать это?
Вот пример того, что эта функция на самом деле делает: