Определить, есть ли серый цвет в изображении с помощью opencv Python

#python #opencv

#python #opencv #обработка изображений

Вопрос:

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

 import numpy as np
import cv2
import pyautogui
from mss import mss
from PIL import Image

mon = {'top': 268, 'left': 968, 'width': 931, 'height': 599}

sct = mss()

while 1:
    sct.get_pixels(mon)
    img = Image.frombytes('RGB', (sct.width, sct.height), sct.image)
    cv2.imshow('test', np.array(img))
    if cv2.waitKey(25) amp; 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break
  

Но я понятия не имею, как определить, отображается ли серый цвет на экране (другие вопросы касаются того, все ли изображение серое, а не отображается ли серый цвет на экране)

Комментарии:

1. есть ли у вас конкретное, известное значение серого? вы можете искать значения rgb, которые находятся в пределах нескольких точек друг от друга

2. @TenaciousB Да, я знаю конкретное значение серого, но как мне искать значения RGB на экране, вот что я не знаю, как это сделать

3. См. cv2.inRange() для определения порогового значения цвета. Пороговое значение изображения. Затем подсчитайте количество белых пикселей или просто проверьте среднее значение. Если больше 0, в нем есть немного белого, и, следовательно, оригинал имеет серый цвет. См docs.opencv.org/4.1.1/d2/de8 /. … Затем найдите примеры на этом форуме или в Google.

4. проверьте мой ответ @avielovadiya

Ответ №1:

Лучший способ — изменить цветовое пространство на HSV и найти диапазон значений оттенка для цвета.

  • Возьмите каждый кадр видео
  • Преобразовать из BGR в цветовое пространство HSV
  • Пороговое значение изображения HSV для диапазона синего цвета

Приведенный ниже код взят с официального сайта OpenCV для обнаружения объекта синего цвета

 import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
    # Take each frame
    _, frame = cap.read()
    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # Threshold the HSV image to get only blue colors
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    # Bitwise-AND mask and original image
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    k = cv.waitKey(5) amp; 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

  

Для обнаружения серого цвета на экране в реальном времени

диапазон будет в HSV равен

нижний цвет = np.array([0,0,0]) верхний цвет = np.array([255,10,255])

В цветовом пространстве HSV / HSL насыщенность пикселей серого цвета очень близка к нулю. Затем канал значений сообщит вам, как далеко по шкале от черного до белого они находятся на самом деле, низкая яркость / значение темно-серое, тогда как высокая яркость / значение означает светло-серый.

Итак, для серого цвета ваш код выглядит следующим образом

 import numpy as np
from PIL import Image
from mss import mss
import cv2 as cv
import cv2
mon = {'top': 268, 'left': 968, 'width': 931, 'height': 599}
sct = mss()
while (1):
  # Take each
  sct.get_pixels(mon)
  img = Image.frombytes('RGB', (sct.width, sct.height), sct.image)
  img = np.array(img)
  # Convert RGB to HSV
  hsv = cv.cvtColor(img, cv.COLOR_RGB2HSV)
  # define range of gray color in HSV
  lower_gray = np.array([0, 0, 0])
  upper_gray = np.array([255, 10, 255])
  # Threshold the HSV image to get only gray colors
  mask = cv.inRange(hsv, lower_gray, upper_gray)
  # Bitwise-AND mask and original image
  res = cv.bitwise_and(img, img, mask=mask)
  cv.imshow('original', img)
  cv.imshow('mask', mask)
  cv.imshow('res', res)
  k = cv.waitKey(5) amp; 0xFF
  if k == 27:
    break
cv.destroyAllWindows()

  

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

 import cv2
import numpy as np
image_path ="trail.jpg"
img = cv2.imread(image_path)
# Convert BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# define range of gray color in HSV
lower_gray = np.array([0,0,0])
upper_gray = np.array([255,10,255])
# Threshold the HSV image to get only gray colors
mask = cv2.inRange(hsv, lower_gray, upper_gray)
# Bitwise-AND mask and original image
res = cv2.bitwise_and(img,img, mask= mask)
cv2.imwrite("output.png",res)
  

Комментарии:

1. Проверьте ссылку определите свой диапазон серого цвета с помощью cv2.trackbar

2. Спасибо за ответ, но вы отправляете мне код для обнаружения серого в камере, и он мне нужен на экране компьютера

3. @avielovadiya, вам нужно для изображения, которое уже захвачено

4. Последний добавленный вами раздел будет соответствовать коду определения серого цвета? что вы добавили? Потому что я хочу обнаруживать серый цвет в режиме реального времени на экране, а не только на одном изображении

5. что вы подразумеваете под экраном