Я пытаюсь обнаружить разноцветные точки на белом / сером фоне. Точки бывают трех разных цветов (желтый, фиолетовый, синий) разного размера. Вот исходное изображение:
Я преобразовал изображение в формат HSV и нашел нижнюю и верхнюю границы для каждого изображения, затем применил определение контура, чтобы найти эти точки . Следующий код обнаруживает большинство точек:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image1_1.png')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_yellow = np.array([22,25,219])
upper_yellow = np.array([25,75,225])
lower_purple = np.array([141,31,223])
upper_purple = np.array([143,83,225])
lower_blue = np.array([92,32,202])
upper_blue = np.array([96,36,208])
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask_purple = cv2.inRange(hsv, lower_purple, upper_purple)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)
res_blue = cv2.bitwise_and(img,img, mask=mask_blue)
res_purple = cv2.bitwise_and(img,img, mask=mask_purple)
res_yellow = cv2.bitwise_and(img,img, mask=mask_yellow)
gray_blue = cv2.cvtColor(res_blue, cv2.COLOR_BGR2GRAY)
gray_purple = cv2.cvtColor(res_purple, cv2.COLOR_BGR2GRAY)
gray_yellow = cv2.cvtColor(res_yellow, cv2.COLOR_BGR2GRAY)
_,thresh_blue = cv2.threshold(gray_blue,10,255,cv2.THRESH_BINARY)
_,thresh_purple = cv2.threshold(gray_purple,10,255,cv2.THRESH_BINARY)
_,thresh_yellow = cv2.threshold(gray_yellow,10,255,cv2.THRESH_BINARY)
contours_blue, hierarhy1 = cv2.findContours(thresh_blue,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours_purple, hierarhy2 = cv2.findContours(thresh_purple,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours_yellow, hierarhy3 = cv2.findContours(thresh_yellow,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
result = img.copy()
cv2.drawContours(result, contours_blue, -1, (0, 0, 255), 2)
cv2.drawContours(result, contours_purple, -1, (0, 0, 255), 2)
cv2.drawContours(result, contours_yellow, -1, (0, 0, 255), 2)
cv2.imwrite("_allContours.jpg", result)
Вот обнаруженные контуры:
Проблема в том, что некоторые цветных точек не обнаруживаются. Я понимаю, что путем точной настройки цветовых диапазонов (нижнего и верхнего) можно обнаружить больше точек. Но это требует очень много времени и не может быть распространено на похожие изображения. Например, следующее изображение похоже на первое изображение выше и имеет те же разноцветные точки, но фон немного отличается. После того, как я прогнал его через приведенный выше код, он не смог обнаружить ни одной из точек. Я на правильном пути? Есть ли более масштабируемое и надежное решение с меньшей потребностью в настройке параметров цвета для решения этой проблемы? Вот другое изображение, которое я пробовал: