Как определить цвет пикселя

Обновлено: 21.11.2024

Команда Devexperts Quality Assurance рада сообщить вам о наших последних новостях. Мы точно сравниваем инструменты тестирования, которые используем, чтобы добиться максимальной производительности 1 . Мы адаптируем наш процесс тестирования, когда бизнес меняется быстрыми темпами 2 3 . И мы начинаем открывать исходный код наших внутренних проектов с помощью SUITCase — отличного инструмента для тестирования скриншотов приложений iOS и iPadOS 4 .

Основная идея SUITCase – предоставить множество различных стратегий сравнения. Он не только поддерживает тестирование с попиксельной точностью. Кроме того, он может допускать незначительные цветовые различия или полностью игнорировать цветовой оттенок. Способ расчета разницы цветов и интенсивности света не так очевиден, как может показаться. В этой статье мы расскажем вам о различных подходах к вычислению цветовой разницы между двумя цветами и о том, почему это важно при тестировании скриншотов.

Проблема

Предположим, мы тестируем приложение Apple Health. Мы записали эталонные скриншоты на iOS 13.0 и хотим запустить тесты скриншотов несколькими версиями позже — на симуляторах под iOS 13.5. На следующих снимках экрана показано приложение «Здоровье» в этих двух версиях. Сколько изменений пользовательского интерфейса вы видите?

Скриншоты приложения Apple Health для iOS 13.0 и 13.5.

Некоторые изменения более заметны, чем другие. Например, кнопка «Обзор» на панели вкладок стала больше, чтобы соответствовать кнопке «Сводка». Маленькие стрелки справа от ячеек категорий стали тоньше, но сохранили свой цвет. Говоря о цвете, вы заметили другой оттенок значка осознанности?

Графическая разница между скриншотами приложения Health.

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

Разница между цветами iOS 13.0 и 13.5.

Давайте сравним изменение цвета значков активности и осознанности.

Разница между Вермиллионом и Оранжевым едва заметна, а Яично-голубой Робин легко отличить от Малибу. Мы не хотим относиться к незначительным цветовым различиям так, как обращаем внимание на гораздо более заметные изменения. Кроме того, мы не хотим получать ложноотрицательные результаты тестов из-за почти невидимых изменений.

Итак, как нам рассчитать цветовую разницу?

Разница в цвете

Давайте быстро освежим в памяти то, что мы знаем о пикселях RGB. Цвета пространства RGB относительно легко отображать, потому что большинство современных экранов (включая устройства iOS и iPadOS) используют физические пиксели RGB. Все, что вам нужно сделать, это смешать три дополнительных основных цвета (красный, зеленый и синий). 24-битная модель RGB позволяет нам создать около 16,7 миллионов цветов, смешанных с 256 дискретными уровнями каждого цветового компонента 5 .

В чем разница между двумя цветами в 24-битной модели RGB? У нас есть две точки в трехмерном пространстве (называемые цветовым кубом), поэтому евклидово расстояние (ΔCE) должно быть в порядке.

Проблема в том, что человеческий глаз не воспринимает цвета так, как их отображают электронные устройства. Мы различаем оттенки зеленого более эффективно, чем оттенки синего и красного 6 (даже если их трудно назвать 7 ). Наши предки жили в зеленом мире, а наши глаза еще не адаптировались к современному миру. Чтобы улучшить вклад цветовых компонентов, мы должны использовать взвешенную сумму вместо простой суммы перед вычислением квадратного корня.

В CompuPhase 8 есть отличная статья, в которой предлагаются два способа вычисления взвешенных евклидовых функций расстояния. Первый (ΔC1) использует два фиксированных набора весов в зависимости от среднего значения красных компонентов. Если среднее значение меньше половины, функция регулирует разницу синих компонентов больше, чем красных компонентов. Если среднее значение высокое, вклад красных компонентов оценивается больше.

Разница между зелеными компонентами является главным приоритетом в обоих случаях.

Есть еще одно объяснение этому подходу — мы можем использовать простое евклидово расстояние, но в модификации цветового куба.Цветной куб растягивается, образуя два цветных параллелепипеда.

Второй способ вычисления разницы цветов (ΔC2) плавно преобразует цветовой куб. Вместо двух фиксированных наборов весов применяются более точные веса.

Давайте сравним три упомянутых выше подхода. На следующем изображении показаны пять цветов.

Мы рассчитаем цветовую разницу между лимоном и четырьмя другими цветами — мандарином, бананом, спаржей и лаймом. Как вы думаете, какой цвет ближе всего к лимонному? И какой из них наименее похож?

Согласно результатам, все три формулы говорят нам о том, что цвет спаржи ближе всего к цвету лимона. А как же самые близкие? Простое евклидово расстояние (ΔCE) является наименьшим для Tangerine, а первое взвешенное расстояние (ΔC1< /em>) говорит, что лайм больше всего похож на лимон. Лаймы и лимоны очень похожи по вкусу, но, по мнению большинства нашей команды контроля качества, два наиболее похожих цвета — лимонный и банановый. Второе взвешенное расстояние (ΔC2) доказывает это.

Есть и другие, более точные методы, но они требуют преобразования пикселей RGB в другие представления 9 . Такие преобразования требуют дополнительных вычислений, поэтому мы выбрали ΔC2 в качестве метода расчета цветового различия для SUITCase.

Результат

Вернемся к примеру в начале.

Теперь мы знаем, как рассчитать разницу между Orange и Vermillion, которая равна 0,08, а разница между Malibu и Robin’s Egg Blue намного выше и равна 0,193. Давайте посмотрим, как выбор порога цветового различия (T), разделяющего совпадающие и не совпадающие пиксели, влияет на стабильность тестирования. На следующем изображении показаны несовпадающие пиксели для T ∈ .

Вы видите, как увеличение порога приводит к уменьшению количества несовпадающих пикселей. Наш инструмент для тестирования снимков экрана SUITCase позволяет пользователям настраивать этот порог, который по умолчанию равен 0,1.

Заключение

Игнорирование незначительных различий в цвете позволяет повысить стабильность тестирования скриншотов. Вы можете попробовать эту функцию прямо сейчас, так как код доступен на GitHub 4 , и мы будем рады вашим отзывам.

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

Пройдите небольшой тест, чтобы узнать, насколько хорошо вы различаете цвета:

Какие инструменты вы используете для автоматизации тестирования скриншотов? Как вы относитесь к незначительным цветовым различиям?

Если я открываю изображение с помощью open("image.jpg") , как я могу получить значения RGB для пикселя, если у меня есть координаты пикселя?

Тогда, как я могу сделать обратное? Начиная с пустого изображения, «записать» пиксель с определенным значением RGB?

Я бы предпочел, чтобы мне не нужно было загружать какие-либо дополнительные библиотеки.

13 ответов 13

Вероятно, для этого лучше всего использовать библиотеку изображений Python, которую, боюсь, можно загрузить отдельно.

Самый простой способ сделать то, что вы хотите, — использовать метод load() объекта Image, который возвращает объект доступа к пикселю, которым вы можете манипулировать как массивом:

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

Для будущих читателей: подушка установки pip успешно и довольно быстро установит PIL (может потребоваться sudo, если не в virtualenv).

pillow.readthedocs.io/en/latest/… показывает команды bash на этапах установки Windows. Не знаю, что делать дальше.

Используя Pillow (который работает как с Python 3.X, так и с Python 2.7+), вы можете делать следующее:

Теперь у вас есть все значения пикселей. Если это RGB или другой режим, его можно прочитать с помощью im.mode. Затем вы можете получить пиксель (x, y) с помощью:

Кроме того, вы можете использовать Numpy и изменить форму массива:

Полное и простое в использовании решение

Проверить код дымом

Возможно, вы не уверены в порядке ширины/высоты/канала. По этой причине я создал этот градиент:

  • Форма (ширина, высота, каналы)
  • Изображение[0] , то есть первая строка, содержит 26 троек одного цвета.

Будьте осторожны, список параметров «изменить форму» должен быть (высота, ширина, каналы). а для изображений rgba вы можете включить image.mode = RGBA с каналами = 4

Верно ли утверждение @gmarsi о ширине и высоте? Действительно ли оба варианта действительны?Вам необходимо знать, как выводятся данные, чтобы знать, какую форму будет иметь выходной массив и где будут располагаться пиксельные данные строк и столбцов изображения.

PyPNG – облегченный декодер/кодировщик PNG

Хотя вопрос намекает на JPG, я надеюсь, что мой ответ будет полезен для некоторых людей.

Вот как читать и записывать пиксели PNG с помощью модуля PyPNG:

PyPNG – это отдельный модуль Python длиной менее 4 000 строк, включая тесты и комментарии.

PIL — это более полная библиотека изображений, но она также значительно тяжелее.

Как сказал Дэйв Уэбб:

Вот мой рабочий фрагмент кода, печатающий цвета пикселей из изображения:

Почему при запуске кода Лаклана Филлипса я получаю четыре значения? Я даю это: print(pix[10,200]) и получаю это: (156, 158, 157, 255) Почему?

Вероятно, это связано с тем, что ваше изображение поддерживает альфа-прозрачность и имеет формат rgba, а это означает, что четвертое значение указывает, насколько прозрачен этот пиксель.

Обработка изображений — сложная тема, и лучше всего, если вы делаете использование библиотеки. Я могу порекомендовать gdmodule, который обеспечивает легкий доступ ко многим различным форматам изображений из Python.

Кто-нибудь знает, почему за это проголосовали? Есть ли известная проблема с libgd или что-то в этом роде? (Я никогда не смотрел на это, но всегда приятно знать, что есть альтернатива PiL)

Вы можете использовать модуль Surfarray от pygame. Этот модуль имеет метод возврата трехмерного массива пикселей, называемый пикселями3d(поверхность). Я показал использование ниже:

Надеюсь, был полезен. Последнее слово: экран заблокирован на время жизни screenpix.

Используя библиотеку под названием Pillow, вы можете превратить это в функцию для простоты использования позже в вашей программе, а также если вам придется использовать ее несколько раз. Функция просто принимает путь к изображению и координаты пикселя, который вы хотите «захватить». Он открывает изображение, преобразует его в цветовое пространство RGB и возвращает R, G и B запрошенного пикселя.

*Примечание: я не был первоначальным автором этого кода; это было оставлено без объяснения причин. Поскольку это довольно легко объяснить, я просто даю пояснение на тот случай, если кто-то в будущем его не поймет.

P = impixel позволяет интерактивно выбирать пиксели из изображения по текущим осям. Когда вы закончите выбирать пиксели, impixel возвращает значения пикселей в p .

Используйте обычные нажатия кнопок для выбора пикселей. Нажмите Backspace или Delete, чтобы удалить ранее выбранный пиксель. Чтобы добавить последний пиксель и завершить выбор пикселя за один шаг, нажмите клавишу SHIFT, щелкните правой кнопкой мыши или дважды щелкните. Чтобы завершить выбор пикселей без добавления последнего пикселя, нажмите клавишу «Ввод». С этим синтаксисом и другими интерактивными синтаксисами инструмент выбора пикселей блокирует командную строку MATLAB®, пока вы не завершите операцию.

P = impixel( I ) отображает изображение в градациях серого, RGB или бинарное изображение I в окне рисунка и ожидает, пока вы выберете пиксели в изображении с помощью мыши.

P = impixel( X , cmap ) отображает индексированное изображение X с цветовой картой cmap в окне рисунка и ожидает, пока вы выберете пиксели в изображении с помощью мыши.

Выбрать пиксели, указав координаты

P = impixel( I , xi , yi ) возвращает значения пикселей в оттенках серого, истинном цвете или бинарном изображении I . Пиксели имеют (x, y) координаты xi и yi .

P = impixel( X , cmap , xi , yi ) возвращает значения пикселей в индексированном изображении X с помощью cmap цветовой карты. Пиксели имеют (x, y) координаты xi и yi .

P = impixel( xref , yref , I , xi , yi ) возвращает значения пикселей в изображении I, используя мировую систему координат, определенную xref и yref . Вершины пикселей имеют (x, y) координаты xi и yi в этой системе координат.

P = impixel( xref , yref , X , cmap , xi , yi ) возвращает значения пикселей в индексированном изображении X с цветовой картой cmap , используя мировую систему координат, определенную xref и yref . Вершины пикселей имеют (x, y) координаты xi и yi в этой системе координат.

Дополнительно возвращать координаты выбранного пикселя

[ xi2 , yi2 , P ] = impixel( ___ ) дополнительно возвращает координаты (x, y) выбранных пикселей, xi2 и yi2 . Вы можете использовать входные аргументы любого другого синтаксиса.

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

Вот цифровое изображение некоторых желтых цветов:

Увеличить — Пиксели

  • Увеличьте левый верхний цветок в 10 раз.
  • Изображение состоит из пикселей.
  • Каждый пиксель: маленький, квадратный, одного цвета.
  • Воспринимайте сцену целиком, а не крошечные пиксели.
  • "мегапиксель" – 1 миллион пикселей.
  • Сколько пикселей в изображении шириной 800 пикселей и высотой 600 пикселей?
    - просто умножьте
    - 800 x 600 = 480 000 пикселей = 0,48 мегапикселя
  • Обычное цифровое изображение – 5–20 мегапикселей.

Увеличив изображение верхнего левого цветка, мы видим, что он на самом деле состоит из множества квадратных «пикселей», каждый из которых имеет один цвет.

Пиксельная сетка X/Y

  • Пиксели организованы в виде сетки x/y.
  • x=0, y=0 "исходный" верхний левый угол – он же (0, 0)
  • X растет вправо
  • Y растет вниз
  • Точно так же, как набирать страницу текста
  • x=0, y=0 "начало" вверху слева — (0, 0)
  • x=1, y=0 сосед справа от начала координат - (1, 0)
  • x=0, y=1 сосед ниже начала координат - (0, 1)

Теперь поговорим о цветах.

История в стороне — цветная призма Ньютона

  • Один из известных экспериментов Ньютона.
  • Белый свет, разбитый на чистые цвета, непрерывный.
  • Красный, оранжевый, желтый, зеленый, синий, индиго, фиолетовый (ROY G BIV)
  • Смешайте выбранные цвета, чтобы получить другие цвета.
  • Например, провести эксперимент в обратном порядке, чтобы получить белый цвет.

Сэр Исаак Ньютон провел знаменитый эксперимент с призмой в 1665 году, показав, что белый свет состоит из спектрально окрашенного света. Вот фото эксперимента на моем полу. Белый солнечный свет падает слева в стеклянную треугольную призму, которая разделяет свет. Выйдя из призмы, мы имеем непрерывный диапазон чистых цветов, и некоторые из них выделены по названию: красный, оранжевый, желтый, зеленый, синий, индиго, фиолетовый (ROY G BIV).

Цветовая схема RGB — красный, зеленый, синий

  • Как представить цвет пикселя?
  • RGB – схема "красный/зеленый/синий".
  • Создайте любой цвет, комбинируя красный, зеленый и синий цвета.
  • Есть и другие схемы, но RGB очень распространен
  • Примечание: смешивание источников света отличается от смешивания красок.
  • Кроме того, технически цвет – это трехмерное пространство, не вдаваясь в детали.
    – Призма Ньютона показывает измерение «оттенка»
    – Другие измерения – яркость и насыщенность (пастель)

Как представить цвет пикселя? Схема красный/зеленый/синий (RGB) — один из популярных способов представления цвета в компьютере. В RGB каждый цвет определяется как определенное сочетание чистого красного, зеленого и синего света.

Обозреватель RGB

Лучший способ увидеть, как работает RGB, — просто поиграть. На этой странице RGB Explorer показано, как можно получить любой цвет, комбинируя красный, зеленый и синий свет. Каждый свет кодируется числом от 0 (выкл.) до 255 (самая яркая).

RGB – три числа

  • Создайте любой цвет, комбинируя красный, зеленый и синий свет.
  • Каждый красный/зеленый/синий свет обозначается числом 0,255
    255 = максимальная яркость,
    0 = выключен
  • Поэтому любой цвет может быть представлен тремя числами от 0 до 255
  • Не только 0 и 255, промежуточные значения 12, 238, 39
  • напр. r:250 g:10 b:240 - фиолетовый, или просто скажите "250 10 240"
  • напр. r:100 g:100 b:0 - темно-желтый или просто скажите "100 100 10"

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

Цвет Красный номер Зеленый номер Синий номер
красный 255 0 0
фиолетовый 255< /td> 0 255
желтый 255 255 0
темно-желтый 100 100 0
белый 255 255 255
черный 0 0 0

В RGB цвет определяется как смесь чистого красного, зеленого и синего цветов различной интенсивности. Каждый из уровней красного, зеленого и синего света кодируется числом в диапазоне от 0 до 255, где 0 означает отсутствие света, а 255 — максимальный свет.

Например, (красный = 255, зеленый = 100, синий = 0) – это цвет, в котором красный – максимальный, зеленый — средний, а синий отсутствует вообще, что приводит к оттенку оранжевого. Таким образом, задав яркость 0..255 для красной, синей и зеленой цветовых составляющих пикселя, можно сформировать любой цвет.

Примечание по пигменту: у вас могут быть смешанные цветные краски, например, смешанные красная и зеленая краски. Такое «пигментное» смешивание цветов работает совершенно иначе, чем «светлое» смешивание, которое мы имеем здесь. Мне кажется, легкое микширование проще для понимания, и в любом случае это наиболее распространенный способ, с помощью которого компьютеры хранят изображения и управляют ими.

Вы не обязаны запоминать, например, как выглядит blue=137. Вам просто нужно знать наиболее распространенные шаблоны RGB, которые мы используем.

Ты попробуй

<р>1. В проводнике RGB поиграйте с ползунками, чтобы получить светло-коричневый цвет кофе латте.

<р>2.Узнайте, как сделать апельсин

<р>3. Узнайте, как сделать коричневый. Коричневый в основном темно-оранжевый.

Демонстрация в классе — сверхъяркие светодиоды

  • Отображение чистого красного, зеленого, синего – светодиодный индикатор.
  • Показать двухцветные комбинации
  • Показать белый

Диаграмма изображения с RGB

  • Полная схема изображения.
  • Пиксели в сетке, каждый из которых определяется координатой x,y.
  • У каждого пикселя есть 3 числа, определяющие его цвет.
  • Записывается как "красный:6 зеленый:250 синий:7"
  • Или просто "6 250 7"

2 темы CS: много маленьких цифр + редактирование

  • Начать со всего изображения
  • Тема 1: изображение "разбивается" на множество маленьких чисел в компьютере
  • Тема 2. Как изменить изображение на компьютере?
  • Изменить некоторые цифры → изменить изображение
  • напр. пройдите и уменьшите вдвое все красные значения
  • Вот куда мы идем

Мы начали с целого изображения и сократили его до большого набора мелких элементов. Это распространенная тема в компьютерных науках: то, что выглядит как сложное целое, в компьютере "атомизировано" (составлено из очень большого набора очень простых элементов).

Итак, мы можем начать с цельного текстурированного цифрового изображения чего-либо. Затем разбейте его на маленькие квадратные пиксели. Затем каждый пиксель разбивается на 3 числа в диапазоне 0-255. Это типичный компьютерный шаблон: что-то большое и сложное разбивается на части и представляется в виде множества маленьких чисел, если вы посмотрите за кулисы.

Как изменить изображение? Изменения в изображение вносятся путем просмотра и изменения чисел, составляющих изображение.

Читайте также: