Рисование контуров вокруг объектов с помощью OpenCV - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь нарисовать контур на двух перекрывающихся объектах.Здесь я делаю фото двух ручек.Но он не может идеально рисовать контуры.Внутри есть несколько маленьких контуров.Как мне удалить его?

Вот мое оригинальное фото

enter image description here

и результат

enter image description here

import cv2
import numpy as np 
from matplotlib import pyplot as plt 

img = cv2.imread('img/pen001.jpg',1)

img =  cv2.cvtColor(img , cv2.COLOR_BGR2RGB)

imgray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

ret, thresh = cv2.threshold(imgray, 102 , 160, 0)

kernel = np.ones((5,5), np.float32)/10
dst = cv2.filter2D(thresh, -1, kernel)

contour1, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img , contour1, -1, (0, 255, 0), 3 )
plt.imshow(dst)
plt.show()
plt.imshow(img)
plt.show()

1 Ответ

1 голос
/ 22 июня 2019

Вот потенциальный подход к получению контуров

  • Преобразование изображения в оттенки серого и размытие изображения
  • Порог для получения двоичного изображения
  • Поиск контуров
  • Итерация по контурам и фильтрация с использованием минимальной площади контура
  • Рисование контуров

Пороговое изображение

enter image description here

Поиск контуров

enter image description here

Обратите внимание, что на этом изображении обнаружены небольшие контуры внутри пера и нежелательные контуры на бумаге.Ваш вопрос был, как убрать небольшие контуры внутри.Есть два решения для этого.Первый - использовать cv2.RETR_EXTERNAL вместо cv2.RETR_TREE, а второй - отфильтровывать небольшие контуры по их площади, используя cv2.contourArea().После внесения этих изменений, вот результат

enter image description here

import cv2

image = cv2.imread('1.jpg')
blur = cv2.medianBlur(image, 9)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 110 ,255, cv2.THRESH_BINARY_INV)[1]

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

min_area = 5000
for c in cnts:
    area = cv2.contourArea(c)
    if area > min_area:
        cv2.drawContours(image,[c], 0, (36,255,12), 2)

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