Как обрезать объект на изображении с определенным цветом фона в opencv-python?

#python #image #opencv #cv2

#python #изображение #opencv #cv2

Вопрос:

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

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

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

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

1. Вы говорите о том, чтобы вырезать изображение, где находится объект, а затем изменить его размер, или вы просто хотите вырезать изображение?

2. вырежьте наименьший прямоугольник, содержащий объект.

3. Где ваш образец изображения?

4. Моя репутация ниже 10, поэтому я не могу поместить картинку в свой вопрос, вы можете проверить по этой ссылке: ibb.co/jMJKdfT

5. Есть два варианта: с помощью numpy.где получить крайние угловые положения пикселей, которые не равны черному цвету, и вырезать прямоугольник, или изучить это docs.opencv.org/3.4.2/dd/d49/tutorial_py_contour_features.html

Ответ №1:

Наконец, я нашел 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
  

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

1. Если кто-то поможет вам с решением, не бойтесь отдать должное человеку