обнаружение двора внутри сада (cv2) - PullRequest
1 голос
/ 14 июля 2020

Я хочу отделить гра внутри моего сада от травы за его пределами, используя подвал забора и камни. Скрипт должен уметь рисовать красную линию, которую вы видите на втором изображении. Это должно быть возможно с cv2

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

gray = cv2.cvtColor(gras_image, cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
canny = cv2.Canny(blur, 50, 200)

yard

введите описание изображения здесь

Спасибо за помощь

1 Ответ

0 голосов
/ 14 июля 2020

См. Комментарии в моем коде ниже, чтобы узнать, как выбрать на изображении только свой двор.

Это не будет надежным решением, если цвет границы между вашим двором и не изменится . Я нашел подходящий диапазон HSV, открыв ваше изображение в GIMP и выбрав объект коричневой границы с правой стороны с помощью инструмента выбора цвета GIMP. Каким-то чудом этот цвет хорошо подошел и для серых блоков. Вы можете добиться лучших результатов, играя с цветовыми диапазонами или, может быть, даже создав отдельные маски для коричневых и серых блоков.

import cv2
import numpy as np

#load the image
image = cv2.imread("meadow.jpg")

#define the lower and upper bounds of colors to threshold for in the HSV color space.
hsv_lower = (35//2, 0, 120)
hsv_upper = (45//2, 255, 255)

#convert the image to HSV color space
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

#find the areas of the image corresponding to the colors set above
mask = cv2.inRange(hsv_image, hsv_lower, hsv_upper)

#set the detected areas to white and other areas to black
new_image = np.where(mask, np.uint8(0), np.uint8(255))

#erode to fill in the gaps between the black pixels.
new_image = cv2.erode(new_image, kernel=np.ones((7,7)))

#find connected components (the white areas)
labels, stats = cv2.connectedComponentsWithStats(new_image)[1:3]

#create a mask for the area excluding the largest component
not_my_yard = labels != np.argmax(stats[:,cv2.CC_STAT_AREA])

#set the color of the area excluding the largest component to black
image[not_my_yard] = 0

#save the new image
cv2.imwrite("my_yard.jpg", image)

введите описание изображения здесь

...