Как обрезать объект на изображении по определенному цвету фона в opencv-python? - PullRequest
0 голосов
/ 03 апреля 2019

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

В основном изображение имеет черный (0,0,0) фон, но разные цвета для объекта.Я хочу обрезать объект, чтобы удалить бесполезный фон.

Я знаю, что в cv2 есть функция resize (), но они не могут определить, является ли это фоном или нет.Я также могу зациклить все изображение, чтобы найти позицию, но это слишком медленно.

1 Ответ

0 голосов
/ 03 апреля 2019

Наконец-то я нашел API для этой работы.

используйте cv2.findContours (), чтобы получить положение объекта из изображения маски (объекта с соответствующим цветом) и напрямую обрезать его с помощью numpy.

def cut_object(rgb_image,mask_image,object_color):
"""This function is used to cut a specific object from the pair RGB/mask image."""
rgb_image=cv2.imread(rgb_image)
mask_image=cv2.imread(mask_image)
mask_image=cv2.cvtColor(mask_image,cv2.COLOR_BGR2RGB)

# Create mask image with the only object
object_mask_binary=cv2.inRange(mask_image,object_color,object_color)
object_mask=cv2.bitwise_and(mask_image,mask_image,mask=object_mask_binary)

# Detect the position of the object
object_contour=cv2.cvtColor(object_mask,cv2.COLOR_BGR2GRAY)
object_position,c=cv2.findContours(object_contour,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
object_position=np.array(object_position).squeeze()
hmin,hmax=object_position[:,:1].min(),object_position[:,:1].max()
wmin,wmax=object_position[:,1:2].min(),object_position[:,1:2].max()

# Cut the object from the RGB image
crop_rgb=rgb_image[wmin:wmax,hmin:hmax]

return crop_rgb
...