2016-02-22 1 views
1

фонпитон обнаружить цвета вне диапазона

Я строю программу, которая преобразует скриншот приложения для обмена сообщениями в текст. Один шаг - использовать открытую функцию CV matchTemplate, чтобы найти, существует ли какая-либо эмуляция на скриншоте. Поскольку я должен повторять более 1600 символов emoji, я хотел бы сначала проверить скриншот, чтобы увидеть, есть ли у него цвета вне диапазона (синий и белый). Если эта проверка верна, я запустил многопользовательский метод сопоставления шаблонов.

Вопрос

Учитывая скриншот ниже, как я могу найти цвета снаружи синий и белый (фон и цвет текста? Я рассматривал, используя OpenCV inRange найти цвета, которые соответствуют синий и белый, сосчитать число пиксели, DonT матча, и посмотреть, если это число меньше, чем общее количество пикселей изображения.

Проблема

цветовых диапазонов I определяют слишком широк, чтобы га ndle все псевдонимы вокруг шрифтов. Края шрифтов - всевозможные синие цвета. Если я определяю большой диапазон, я, возможно, не нахожу emojis.

enter image description here

код до сих пор

# load the image and set up variables 
image = cv2.imread(args["image"]) 
iW, iH = image.shape[:2] 
pixels = iW * iH 
masked = 0 

# define the list of color boundaries 
boundaries = [ 
    ([240, 130, 30], [255, 150, 80]), # blue 
    ([250, 250, 250], [255, 255, 255]) # white 
] 

# loop over the boundaries 
for (lower, upper) in boundaries: 
    # create NumPy arrays from the boundaries 
    lower = np.array(lower, dtype="uint8") 
    upper = np.array(upper, dtype="uint8") 

    # find the colors within the specified boundaries 
    mask = cv2.inRange(image, lower, upper) 

    for row in mask: 
     for px in row: 
      if px == 255: 
       masked += 1 


if masked < pixels: 
    # probably has emojis!!! 
+1

ИЛИ вместе синие и белые маски. Тогда отрицаем. Используйте «any» или «countNonZero», чтобы найти, имеет ли результат белые пиксели – Miki

+0

@Miki, если вы можете выразить OR и часть отрицания в коде? Это мой первый раз пишущий Python – jaredrada

+0

OpenCV имеет «bitwise_or» и «bitwise_not». Вероятно, numpy имеет также определенные функции – Miki

ответ

0

Мое решение.

# load the image and up some tracking variables 
image = cv2.imread(args["image"]) 
accumMask = np.zeros(image.shape[:2], dtype="uint8") 

# define the list of color boundaries 
boundaries = [ 
    ([255, 140, 71], [255, 200, 200]), 
    ([255, 150, 100], [255, 255, 255]) 
] 

# loop over the boundaries 
for (lower, upper) in boundaries: 
    # create NumPy arrays from the boundaries 
    lower = np.array(lower, dtype="uint8") 
    upper = np.array(upper, dtype="uint8") 

    # find the colors within the specified boundaries 
    mask = cv2.inRange(image, lower, upper) 

    # merge the mask into the accumulated masks 
    accumMask = cv2.bitwise_or(accumMask, mask) 

accumMask = cv2.bitwise_not(accumMask) 

# show the images 
# cv2.imshow("images", np.hstack([accumMask])) 
# cv2.waitKey(0) 

unmasked = cv2.countNonZero(accumMask) 

if unmasked: 
    print "has emoji" 
else: 
    print "none" 

 Смежные вопросы

  • Нет связанных вопросов^_^