Поиск красного цвета с использованием Python & OpenCV

Я пытаюсь извлечь красный цвет из изображения. У меня есть код, который применяет пороговое значение, чтобы оставить только значения из указанного диапазона:

img=cv2.imread('img.bmp') img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV) lower_red = np.array([0,50,50]) #example value upper_red = np.array([10,255,255]) #example value mask = cv2.inRange(img_hsv, lower_red, upper_red) img_result = cv2.bitwise_and(img, img, mask=mask) 

Но, как я заметил, красный цвет может иметь значение Hue в диапазоне, скажем, от 0 до 10, а также в диапазоне от 170 до 180. Поэтому я хотел бы оставить значения из любого из этих двух диапазонов. Я попытался установить пороговое значение от 10 до 170 и использовать функцию cv2.bitwise_not, но затем я получу весь белый цвет. Я думаю, что лучшим вариантом было бы создание маски для каждого диапазона и использование их обоих, поэтому мне как-то придется объединить их вместе, прежде чем продолжить.

Есть ли способ присоединиться к двум маскам с помощью OpenCV? Или есть другой способ, которым я мог бы достичь своей цели?

Редактировать. Я пришел с не очень элегантным, но рабочим решением:

 image_result = np.zeros((image_height,image_width,3),np.uint8) for i in range(image_height): #those are set elsewhere for j in range(image_width): #those are set elsewhere if img_hsv[i][j][1]>=50 \ and img_hsv[i][j][2]>=50 \ and (img_hsv[i][j][0] <= 10 or img_hsv[i][j][0]>=170): image_result[i][j]=img_hsv[i][j] 

Это в значительной степени удовлетворяет мои потребности, и функции OpenCV, вероятно, делают почти то же самое, но если есть лучший способ сделать это (используя некоторые специальные функции и писать меньше кода), пожалуйста, поделитесь им со мной. 🙂

One Solution collect form web for “Поиск красного цвета с использованием Python & OpenCV”

Я бы просто добавил маски вместе и использовал np.where для маскировки исходного изображения.

 img=cv2.imread("img.bmp") img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # lower mask (0-10) lower_red = np.array([0,50,50]) upper_red = np.array([10,255,255]) mask0 = cv2.inRange(img_hsv, lower_red, upper_red) # upper mask (170-180) lower_red = np.array([170,50,50]) upper_red = np.array([180,255,255]) mask1 = cv2.inRange(img_hsv, lower_red, upper_red) # join my masks mask = mask0+mask1 # set my output img to zero everywhere except my mask output_img = img.copy() output_img[np.where(mask==0)] = 0 # or your HSV image, which I *believe* is what you want output_hsv = img_hsv.copy() output_hsv[np.where(mask==0)] = 0 

Это должно быть намного быстрее и гораздо более читаемым, чем цикл через каждый пиксель вашего изображения.

  • Оперковская гомография, чтобы найти глобальные координаты xy из координат пикселя xy
  • Как удалить дефекты выпуклости на площади Судоку?
  • Предварительная обработка плохо отсканированных рукописных цифр
  • OpenCV не поставляется с «внешними» библиотеками
  • Извлечение всех ограничивающих прямоугольников с использованием OpenCV Python
  • Ошибка при загрузке DLL при импорте cv2
  • как использовать круги hough в cv2 с python?
  • Ошибка перегрузки оператора оболочки Cython C ++ ()
  • Ошибка при использовании cv2.equalizeHist
  • Нарисовать самую длинную линию в контурах OPENCV
  • Преобразовать массив NumPy в cvMat cv2
  • Python - лучший язык программирования в мире.