сохраняя все детали объекта, удаляя форму самым плавным и эффективным способом - PullRequest
0 голосов
/ 04 октября 2018

У меня есть несколько изображений, для которых у меня также есть их маска (зеленая на картинке).Я создаю ограничивающий прямоугольник (пунктирная линия на рисунке) вокруг объекта и беру только эту часть изображения.

enter image description here

Теперь я хотел бы заменить серую часть пикселем, который естественным образом расширяет цвет автомобиля.Например, взять тот же цвет, что и ближайший автомобильный пиксель.В конце я хотел бы получить изображение со всеми деталями автомобиля, но без какой-либо формы.

Я попытался просто инвертировать маску, чтобы маска представляла серый пиксель вокруг автомобиля, а затем использовать функцию «inpaint» из opencv, чтобы закрасить эту новую маску адекватным цветом:

result = cv2.inpaint(car_image,new_mask,50,cv2.INPAINT_NS)

Не работает, так как мы все еще видим границы вокруг машины.

Любые советы будут с благодарностью.Я работаю над Python, и он должен быть достаточно эффективным, так как у меня огромное количество изображений.

1 Ответ

0 голосов
/ 09 октября 2018

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

#replace black pixel by smoothing with adequate color to keep all info, removing shape 
def remove_shape_keep_all_info(img):
    #create mask (s.t. Non-zero pixels indicate the area that needs to be inpainted)
    mask_ = np.array([[1 if j==0 else 0 for j in i] for i in cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)]).astype('uint8')
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
    mask_ = cv2.dilate(mask_, kernel, iterations=4)
    result = cv2.inpaint(img,mask_,5,cv2.INPAINT_TELEA) #,cv2.INPAINT_TELEA, INPAINT_NS
    return (result)
...