Найти контуры не точные - PullRequest
2 голосов
/ 12 февраля 2020

У меня есть вопрос, чтобы найти контуры этого изображения, которое я использовал findcontour не очень точно, я делаю неправильно?

Here's my result but its not accurate.

Here's the image I've used

gs = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gs, (3,3),0)
ret_otsu,im_bw_otsu = cv2.threshold(blur,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

kernel = np.ones((50,50),np.uint8)
closing = cv2.morphologyEx(im_bw_otsu, cv2.MORPH_CLOSE, kernel)
_, contours, hierarchy = cv2.findContours(closing,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

plottedContour = cv2.drawContours(gs,contours,-1,(0,255,0),2)
cv2.imshow('CONTOUR',plottedContour)

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Идея состоит в том, чтобы получить двоичное изображение фильтра для наибольшего контура с предположением, что банан является основным объектом на изображении. Отсюда мы можем нарисовать прямоугольник с помощью cv2.rectangle или обвести контур с помощью cv2.drawContours. При желании мы также можем обрезать область интереса с помощью нарезки Numpy.

Нарисованный прямоугольник

enter image description here

Нарисованный контур

enter image description here

Извлеченный ROI

enter image description here

Код

import cv2

# Load image, grayscale, blur, Otsu's threshold
image = cv2.imread('1.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours and sort for largest contour
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)

for c in cnts:
    # Crop ROI
    x,y,w,h = cv2.boundingRect(c)
    ROI = original[y:y+h, x:x+w]
    cv2.imwrite('ROI.png', ROI)

    # Draw rectangle
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)

    # Draw contours
    # cv2.drawContours(image, [c], -1, (36,255,12), 2)
    break

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
1 голос
/ 12 февраля 2020

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

cv2.drawContours(gs,contours,-1,(0,255,0),2)
cv2.drawContours(gs,contours,0,(0,255,0),2)
cv2.drawContours(gs,contours,1,(0,255,0),2)
cv2.drawContours(gs,contours,2,(0,255,0),2)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...