Как выбрать дочерний контур в OpenCV и повысить точность с помощью python - PullRequest
1 голос
/ 19 июня 2020

Я действительно новичок в OpenCV. :) Работаю над этим почти целый день. После нескольких часов бессонной работы я хотел бы знать, могу ли я еще больше улучшить свой код.

Я написал код, чтобы выбирать только черные отметки на изображениях . Эти черные отметины - детские контуры. Хотя мой код может выбирать некоторые контуры, он не точен. Вы можете увидеть, что код dr aws контуры вокруг теней вместе с черными отметками.

Код 1

Сначала я пробовал использовать хитрое обнаружение края. Но мне не удалось правильно наложить исходное изображение.

import cv2
import numpy as np


image = cv2.imread('3.jpg')
image = cv2.resize(image, (500, 500))
image2 = image
cv2.waitKey(0)

# Grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Find Canny edges
edged = cv2.Canny(gray, 30, 200)
cv2.waitKey(0)

contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

cv2.imshow('Canny', edged)
cv2.waitKey(0)

# print("Number of Contours found = " + str(len(contours)))

cv2.drawContours(image2, contours, -1, (0, 255, 0), 3)

cv2.imshow('Contours', image2)
cv2.waitKey(0)
cv2.destroyAllWindows()

The original image and contours

Код 2

Я смог улучшить Code 1, чтобы он был намного точнее. Вы должны увидеть, что теперь он выбирает только половину большого пальца, ни один из других пальцев и не выбирает отступ на фоне.
Дополнительное изменение фона изображения также увеличивает точность результата .

import cv2
import numpy as np


image = cv2.imread('3.jpg', 0)
image2 = cv2.imread('3.jpg')
image = cv2.resize(image, (500, 500))
image2 = cv2.resize(image2, (500, 500))
cv2.waitKey(0)

ret, thresh_basic = cv2.threshold(image, 100, 255, cv2.THRESH_BINARY)
cv2.imshow("Thresh basic", thresh_basic)

# Taking a matrix of size 5 as the kernel
kernel = np.ones((5, 5), np.uint8)

img_erosion = cv2.erode(thresh_basic, kernel, iterations=1)

#####################

ret, thresh_inv = cv2.threshold(img_erosion, 100, 255, cv2.THRESH_BINARY_INV)
cv2.imshow("INV", thresh_inv)
#####################




# Find Canny edges

edged = cv2.Canny(img_erosion, 30, 200)
cv2.waitKey(0)

contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

cv2.imshow('Canny', edged)
cv2.waitKey(0)

# print("Number of Contours found = " + str(len(contours)))
cv2.imshow('Original', image2)
cv2.drawContours(image2, contours, -1, (0, 255, 0), 3)


cv2.imshow('Contours', image2)
cv2.waitKey(0)
cv2.destroyAllWindows()

enter image description here enter image description here

Могу ли я улучшить свой код?

...