Как извлечь объект в изображениях высокого разрешения? - PullRequest
1 голос
/ 18 октября 2019

У меня есть изображение, вложенное через камеру DSLR, но также виден его фон, на котором находится объект. Я хочу обрезать объект с фона. Размер изображения (3456,5184,3)

Образец изображения:

enter image description here

Я испробовал множество доступных решений, т. Е., Используя openCVтакие методы, как выделение на переднем плане с использованием захвата, пороговое изображение и маскирование, обнаружение краев с неудовлетворительными результатами.

Пожалуйста, предложите правильный подход.

1 Ответ

0 голосов
/ 18 октября 2019

Вот метод, использующий пороговое значение + извлечение контура

  • Оттенки серого, затем размытие по Гауссу
  • Порог Оцу для двоичного изображения
  • Расширение для соединения в один контур
  • Извлечение ROI с нарезкой кусочков

После преобразования в оттенки серого и размытие по Гауссу мы используем порог Оцу

image

Теперь у нас естьнужный объект переднего плана в белом, поэтому мы расширяем, чтобы соединить контуры, чтобы сформировать единый контур

image

Наконец мы получаем координаты ограничивающего прямоугольника и извлекаем ROI

image

import cv2

# Grayscale, Blur, Otsu's threshold then dilate
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,25))
dilate = cv2.dilate(thresh, kernel, iterations=3)

# Extract ROI
x,y,w,h = cv2.boundingRect(dilate)
ROI = image[y:y+h, x:x+w]

cv2.imshow('thresh', thresh)
cv2.imshow('dilate', dilate)
cv2.imshow('ROI', ROI)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...