Есть две проблемы с вашим кодом.Вы получите лучшие результаты, если вы инвертируете и размываете изображение.Это мои результаты после применения этих двух операций перед нахождением контуров:
Функция OpenCV findContours()
находит темные контуры на светлом фоне.Если вы хотите найти пробелы, которые являются камнями, вам нужно сначала инвертировать двоичное изображение.Вы можете инвертировать двоичное изображение, как это invertedImage = 255 - binaryImage
.Размытие также помогает, потому что он соединяет пиксели, которые должны быть связаны, но не из-за низкого разрешенияРазмытие выполняется с помощью кода blurredImage = cv2.blur(img, (2,2))
.Это перевернутое размытое изображение:
Это код, который я использовал:
import cv2
import random
# Read image
gray = 255-cv2.imread('/home/stephen/Desktop/image.png', 0)
gray = cv2.blur(gray, (2,2))
# Find contours in image
contours, _ = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
img = cv2.imread('/home/stephen/Desktop/image.png')
for cnt in contours:
color = random.randint(0,255),random.randint(0,255),random.randint(0,255)
img = cv2.drawContours(img, [cnt], 0, color, cv2.FILLED)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()