Задать вопрос
flapflapjack
@flapflapjack
на треть я прав

Как сравнить списки с погрешностью?

Здравствуйте. Для начала напишу информацию что и зачем, чтобы было понятней для чего это нужно:

Имеется функция вычисления цвета пикселей.

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

pil_image_hp = get_screen(тут координаты участка высотой в пиксель)


Каждый пиксель сравнивается с цветом заполненных жизней
hp_color = [58, 37, 32] # это цвет хелсов

        pixels = pil_image_hp[0].tolist() #берем одну строку пикселей из вырезки
        for pixel in pixels:
            print pixel
            if pixel == hp_color: #если цвет пикселя совпадает с цветом хелсов, прибавляем общие хелсы
                filled_red_pixels += 1


Но дело в том, что видимо из-за того, что полоса с жизнями в игре имеет некоторую прозрачность, при попадании какого-либо объекта за полосу жизней - цвет пикселей меняется на мельчайшую величину. Из-за этого количество пикселей цвета здоровья высчитывается неправильно:

Цвета найденных пикселей:
[58, 36, 32] - видна полоса здоровья
[58, 37, 32] - видна полоса здоровья
[58, 36, 32] - видна полоса здоровья
[58, 37, 32] - видна полоса здоровья
[58, 37, 32] - видна полоса здоровья
[58, 36, 32] - видна полоса здоровья
[58, 37, 32] - видна полоса здоровья
[58, 36, 32] - видна полоса здоровья
[57, 35, 31] - видна полоса здоровья
[148, 37, 24] - отсутствует цвет полосы здоровья (потраченые хелсы)
[147, 37, 24] - отсутствует цвет полосы здоровья (потраченые хелсы)
[147, 37, 24] - отсутствует цвет полосы здоровья (потраченые хелсы)
[147, 37, 24] - отсутствует цвет полосы здоровья (потраченые хелсы)
[147, 37, 24] - отсутствует цвет полосы здоровья (потраченые хелсы)
[147, 37, 24] - отсутствует цвет полосы здоровья (потраченые хелсы)
[147, 37, 24] - отсутствует цвет полосы здоровья (потраченые хелсы)
[147, 37, 24] - отсутствует цвет полосы здоровья (потраченые хелсы)


Как видно - разброс совсем маленький - на один-два всего.

Как можно произвести сравнение списков с допущением разброса?
То есть проблема вот в этой строке:

if pixel == hp_color:
  • Вопрос задан
  • 200 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
adugin
@adugin Куратор тега Python
numpy.isclose
numpy.allclose

P.S. Работать с изображениями и массивами чисел циклами на Python - знатное извращение.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@EugeneSCH
сравнить каждый элемент списка с отклонением
>>> pixel = [57, 35, 31]
>>> hp_color = [58, 36, 32]
>>> delta = 2

>>> if False in [_ for _ in map(lambda x,y: abs(x-y) < delta, pixel, hp_color) if not _]:
... print('Цвета отличаются')
... else:
... print('Цвета совпадают')
...
Цвета совпадают
>>>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы