Как найти цветной пиксель

from PIL import Image
def find_rgb(imagename, r_query, g_query, b_query):
    img = Image.open(imagename)
    pix = img.load()
    coordinates= []
    for x in range(img.size[0]):
        for y in range(img.size[1]):
            r, g, b = pix[x,y]
            if matching_algo(r, g, b, r_query, g_query, b_query):
                # print("{},{} contains {}-{}-{} ".format(x, y, r, g, b))
                coordinates.append((x, y))
    return(coordinates)


def matching_algo(r, g, b, r_query, g_query, b_query):
    if r == r_query and g == g_query:
        return True
    elif r == r_query and b == b_query:
        return True
    elif b == b_query and g == g_query:
        return  True
    else:
        return False


if __name__== "__main__":
    find_rgb('dead_parrot.jpg', 255, 255, 0)

Give this a try, you can improve my matching algorithm implementation.
I removed your convert() code and used load() instead

Параметры цвета

Websafe:

Выбранные цвета:

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

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

Для этого необходимо загрузить картинку на сайт. Для загрузки файла, нажмите кнопку «Обзор». Выберите нужный файл с изображением и нажмите «Загрузить».   Как только картинка загрузится, вы увидите её на экране. Затем нужно навести курсор на тот пиксель, цвет которого вы хотите определить. В отдельном окне вы сможете увидеть цвет пикселя, а в поле «Текущее значение» отобразится соответствующий номер пикселя  в HTML и RGB цвета пикселя.

Сервис предусматривает сохранение кода цвета в формате HTML и RGB цвета. Для этого нужно навести курсор на нужный пиксель и щелкнуть левой кнопкой мыши. В поле «Сохраненные значения» в отдельном окне вы сможете увидеть цвет пикселя, а так же сохраненные значения кода пикселя в формате HTML и RGB цвета.

-4 / 26 / 9

Регистрация: 06.03.2015

Сообщений: 209

1

Поиск определенного пикселя на экране

25.02.2017, 23:04. Показов 31456. Ответов 20


Студворк — интернет-сервис помощи студентам

Всем привет. Пишу игрового бота.
Дано: Есть часть экрана размером в 1080х871
Нужно: Найти в этой части экрана пиксель с RGB цветом 231 232 99 и вернуть его координаты(х, у). Возможно таких частей будет 2-3.

Буду благодарен за помощь.



0



-4 / 26 / 9

Регистрация: 06.03.2015

Сообщений: 209

01.03.2017, 22:00

 [ТС]

2

Попробовал пропарсить циклом цвета пикселей на нужной мне части экрана… Так-то работает, но ждать минут 10-15 на парсинг большей части пикселей на экране…



0



Эксперт Python

4607 / 2028 / 359

Регистрация: 17.03.2012

Сообщений: 10,086

Записей в блоге: 6

02.03.2017, 10:11

3

Dave_, если делать оптимально, то не может там быть 10-15 минут. Что парсите?



0



Dave_

-4 / 26 / 9

Регистрация: 06.03.2015

Сообщений: 209

02.03.2017, 17:01

 [ТС]

4

На данный момент все до чего додумался мой не шибко опытный мозг, то это до 2-ух циклов фор

Python
1
2
3
4
5
6
7
8
9
10
def pixels(x, y):
    hdc = win32gui.GetWindowDC(win32gui.GetDesktopWindow())
    c = int(win32gui.GetPixel(hdc, x, y))
    return array('i',[(c & 0xff), ((c >> 8) & 0xff), ((c >> 16) & 0xff)]) 
 
def OnTimeCheck():
    for a in range(870):
        for b in range(1080):
            result = pixels(b, a);
            print(result);

Что нужно: представь себе кусок экрана. Размер этого куска 1080х870. Вся часть этого экрана белая, однако где-то на ней существуют черные точки(она может быть как одна, так и несколько). Необходимо: зная точный RGB цвет белых точек найти их точные координаты на экране. Желательно сделать так, что бы сам цикл проверок проходил за 10- секунд.



0



Эксперт Python

4607 / 2028 / 359

Регистрация: 17.03.2012

Сообщений: 10,086

Записей в блоге: 6

02.03.2017, 17:29

5

Dave_, OMG!!! Конечно будет тормозить!
Во-первых, вы в цикле получаете DC. Зачем? Его достаточно получить единожды.
Во-вторых, пиксель вы получаете у него, у контекста. Я не знаю, что там происходит внутри, с winapi плотно не работал, но наверняка внутри там тоже множество всего тормозного и для частых вызовов не предназначенного.

Картинку с этого контекста вам надо запихнуть в bitmap. И уже по нему пробегаться циклом.

Добавлено через 1 минуту
Dave_, да, в третьих.
В возвращаемом значении у вас очень много лишнего. Формируется список и питоновский массив. Избавьтесь от формирования лишних объектов.

Добавлено через 4 минуты
Да, теоретически возможно ещё ускорить, избавившись от питоновских циклов.

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



0



-4 / 26 / 9

Регистрация: 06.03.2015

Сообщений: 209

02.03.2017, 17:36

 [ТС]

6

Спасибо за ответ. С ДС разобрался. Перенес взятие hdc = win32gui.GetWindowDC(win32gui.GetDesktopWindow()) в начало функции, остальное же беру и проверяю в массиве.
Касательно битмап, то понятия не имею как создать битмап и как работать с ним. Не мог бы ты объяснить?



0



882 / 584 / 179

Регистрация: 28.02.2017

Сообщений: 2,359

Записей в блоге: 1

02.03.2017, 18:18

7

Цитата
Сообщение от Dave_
Посмотреть сообщение

win32gui.GetPixel

Никогда не используйте это. Оно в плане скорости работает через какую-то задницу даже в Win7.
Вам надо:
Создать свой HDC и HBITMAP, выбрать второе в первое через SelectObject(), и дальше вроде два варианта будет — гуглите Scan0 и ScanLine.

Добавлено через 2 минуты

Не по теме:

Я никогда не работал с Python, я как бы по Апи. :)
Может вам сделать DLL с такой функцией и просто пользовать из Python?
Он такое может?

Добавлено через 9 минут

Цитата
Сообщение от Dave_
Посмотреть сообщение

hdc = win32gui.GetWindowDC(win32gui.GetDesktopWindow())

Кстати с этим не согласен. У вас какая ОС? Начиная с Win8 вроде какие-то ограничения добавили, ещё не смотрел эту ОСь.
Но по логике вам надо либо HDC окна (GetDC от HWND), либо HDC экрана (GetDC от 0), зачем тут Desktop?

Добавлено через 1 минуту
ReleaseDC(), DeleteDC() и DeleteObject() не забывайте!



0



dondublon

Эксперт Python

4607 / 2028 / 359

Регистрация: 17.03.2012

Сообщений: 10,086

Записей в блоге: 6

02.03.2017, 18:30

8

Цитата
Сообщение от Dave_
Посмотреть сообщение

Касательно битмап, то понятия не имею как создать битмап и как работать с ним. Не мог бы ты объяснить?

Я тоже понятия не имею, но первая же ссылка в гугле по «winapi DC to bitmap» выдала мне код:

C++
1
2
3
4
5
6
7
8
 HDC winDC = GetWindowDC(window);
 HDC memDC = CreateCompatibleDC(winDC);
 BYTE* memory = 0;
 HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&memory, 0, 0);
 SelectObject(memDC, bitmap);
 BitBlt(memDC, 0, 0, bitmap_dx, bitmap_dy, winDC, 0, 0, SRCCOPY);
 DeleteDC(memDC);
 ReleaseDC(window, winDC);

Источник https://www.gamedev.net/topic/… -a-bitmap/
Там в верхней половинке кода — сохранение в файл, это вам не нужно.



0



2740 / 2343 / 620

Регистрация: 19.03.2012

Сообщений: 8,832

02.03.2017, 18:30

9

А вообще зачем юзать API если можно просто сделать скрин с помощью pillow и потом искать с помощью numpy нужные данные в массиве.



1



Rodegast

3 / 3 / 4

Регистрация: 01.08.2015

Сообщений: 6

03.03.2017, 15:05

10

Python
1
2
3
4
5
6
7
8
9
10
import sys
import PySide.QtGui as QtGui
 
HEX_COLOR = "0xffcdd0d8L"
 
app = QtGui.QApplication(sys.argv)
desctop = QtGui.QApplication.desktop()
img = QtGui.QPixmap.grabWindow(desctop.winId()).toImage()
 
print tuple( (x, y) for x in xrange(desctop.width()) for y in xrange(desctop.height()) if hex(img.pixel(x, y)) == HEX_COLOR )



0



Dave_

-4 / 26 / 9

Регистрация: 06.03.2015

Сообщений: 209

03.03.2017, 23:23

 [ТС]

11

Rodegast, Не могу установить PySide из-за того, что у меня 9-я версия питона.
alex925, Попробовал:

Python
1
2
3
4
5
image = PIL.ImageGrab.grab(bbox=None);
    arr = np.asarray(image);
    count = np.count_nonzero(arr);
    for b in range(count):
        print(arr[b]);

Проблема в том, что каждый раз размер массива возвращается разный.

Код

3808462
3800826
3805894
3796368

Да и скорость опять хромает… Может делаю что не так?
dondublon, к сожалению это С++, а не питон



0



Лысанов Виталий

9 / 9 / 3

Регистрация: 24.01.2015

Сообщений: 79

Записей в блоге: 6

04.03.2017, 23:12

12

Может помочь тема:

Поиск фрагмента в изображении

Ниже код, выполняющий захват экрана и поиск предварительно записанной части изображения.

Python
1
2
3
4
5
6
7
8
import autopy
 
zamok  =autopy.bitmap.Bitmap.open("D:/zamok.bmp")
 
rect_vert=(0,0),(100,720)
 
zast=autopy.bitmap.capture_screen(rect_vert)
pos_zamok_sl = zast.find_bitmap(zamok,0.001)

«0.001» — точность сравнения
__
Из проблем:
Левый угол поиска, только нули.
В строке поиск находит координату и переходит на следующую строку.
В играх из интернета изображения могут приходить все время разные и сравнение трудно настроить.
С увеличением области поиска, увеличивается время поиска, но весь захват и поиск — это доли секунды.



0



-4 / 26 / 9

Регистрация: 06.03.2015

Сообщений: 209

05.03.2017, 13:13

 [ТС]

13

Лысанов Виталий, нету ли какого-то заменителя для autopy? Дело в том, что у меня питон 3.5, а autopy на гораздо ранние версии.

Добавлено через 4 минуты
Заглянул в тему, которые ты мне дал ссылку. Ничего не подошло из тамошнего. Сделал два скрина(один то что нужно натйи, второй скрин всего экрана). Во всех способах возвращало фолс(т.е нету).



0



882 / 584 / 179

Регистрация: 28.02.2017

Сообщений: 2,359

Записей в блоге: 1

05.03.2017, 16:03

14

Вам писали:

Цитата
Сообщение от alex925
Посмотреть сообщение

можно просто сделать скрин с помощью pillow и потом искать с помощью numpy нужные данные в массиве

Вы пробовали сиё? Если есть встроенные средства лучше брать их, а не WinAPI.
Из #11 это оно? Может мне не стоит лезть в незнакомую область, но сильно смущает «nonzero» — в цвете более чем может быть «zero».



0



Dave_

-4 / 26 / 9

Регистрация: 06.03.2015

Сообщений: 209

05.03.2017, 17:26

 [ТС]

15

GoodWeather, искал я по гуглу литературу и нашел только поиск через nonzero. Самому не нравится, но это в итоге не играет сути т.к цикл выполняется больше 10 секунд — гораздо больше 10 секунд. Вот еще одна версия пиллоу и нампи, на этот раз без такого поиска:

Python
1
2
3
4
5
img = PIL.ImageGrab.grab(bbox=None);
    arr = numpy.array(img);
    for y in range(1024): # высота экрана
        for x in range(1280): # ширина экрана
            print(arr[x,y]);

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



0



882 / 584 / 179

Регистрация: 28.02.2017

Сообщений: 2,359

Записей в блоге: 1

05.03.2017, 19:00

16

гм… Виснуть тут может например этот вот «print», что он делает?
А если вместо него просто посчитать сколько на картинке например пикселей #FFFFFF?

Добавлено через 2 минуты
Я могу сделать на WinAPI.
Вы сможете переписать на Питон? Или подключить к нему скомпилированную DLL с функцией?
Какой функционал требуется?: Найти в скриншоте заданную мини-картинку 1:1 и выдать координаты угла прямоугольника? А как хранится искомое?



0



-4 / 26 / 9

Регистрация: 06.03.2015

Сообщений: 209

05.03.2017, 21:52

 [ТС]

17

GoodWeather, тут еще новая проблема нарисовалась… В коде, который я бросал в предведущем посте обнаружился баг

Код

Traceback (most recent call last):
  File "D:PythonScriptsSys.py", line 214, in <module>
    OnTimeCheck();
  File "D:PythonScriptsSys.py", line 47, in OnTimeCheck
    if arr[x,y][0] == 129:
IndexError: index 1024 is out of bounds for axis 0 with size 1024

И да, без принта заметно уменьшилось время.

Добавлено через 24 минуты
Непонятно почему появляется эта ошибка. Попробовал вывести инфу о скрине экрана:

Код

<PIL.Image.Image image mode=RGB size=1280x1024 at 0x2401F90>

Т.е в 1024 и дальше есть, а точнее должны быть пиксели и соответствнно инфа о них в массиве



0



882 / 584 / 179

Регистрация: 28.02.2017

Сообщений: 2,359

Записей в блоге: 1

05.03.2017, 23:28

18

гм… Не знаю как в Питонах, а у нас в примитивных языках индексация начинается с нуля. То есть при ширине 1280 диапазон [0..1279].

Добавлено через 1 минуту
Просто действие происходит 1280 x 1024 = 1310720 раз, если это конвертация числа в текст плюс отправка на какой-то некий вывод…



0



2740 / 2343 / 620

Регистрация: 19.03.2012

Сообщений: 8,832

05.03.2017, 23:30

19

Цитата
Сообщение от GoodWeather
Посмотреть сообщение

Не знаю как в Питонах,

Аналогично, так практически везде. Языки где нумерация с 1, это исключение.



0



Лысанов Виталий

9 / 9 / 3

Регистрация: 24.01.2015

Сообщений: 79

Записей в блоге: 6

06.03.2017, 01:21

20

Пример кода с матричным оператором сравнения:

Python
1
2
3
4
5
6
7
8
9
10
11
12
import PIL
import numpy as np
from PIL import ImageGrab
 
 
 
img = PIL.ImageGrab.grab(bbox=None);
arr = np.array(img);
c=np.argwhere(arr[0:3,0:5]==[  1,   0,  17])
print arr[0:3,0:5]
print "______"
print c

Вывод программы:

[[[ 2 1 19]
[ 1 0 17]
[ 2 1 19]
[ 2 1 19]
[ 0 0 20]]

[[ 3 2 20]
[ 1 0 18]
[ 1 0 18]
[ 0 0 18]
[ 0 0 20]]

[[ 3 1 19]
[ 1 0 18]
[ 0 0 18]
[ 0 0 18]
[ 0 1 21]]]
______
[[0 1 0]
[0 1 1]
[0 1 2]

[0 4 1]
[1 1 0]
[1 1 1]
[1 2 0]
[1 2 1]
[1 3 1]
[1 4 1]
[2 1 0]
[2 1 1]
[2 2 1]
[2 3 1]]
>>>

Ответ, это координата 0,1. Только на этой координате в третьей колонке цифры 0,1,2 и только эти координаты встречаются в выводе три раза и матричные операторы работают намного быстрее циклов.



1



Иногда нам просто необходимо определить координаты положения курсора мышки в какой-то момент времени. Но как это сделать? Есть несколько способов.

Самым простым, на первый взгляд, очевидным способом является создание скриншота всего экрана и по получившемуся изображению в любой графической программе (Photoshop или Paint) посмотреть координаты нужного пикселя от левого верхнего угла картинки.

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

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

Программа для определения координат и цвета пикселя на экране.

В интернете можно попытаться найти подобный софт, который в своем отдалении может помочь решить поставленную задачу, узнать координаты курсора и цвет пикселя под ним. Но, попробуйте найти!

Всё, что попадалось на просторах интернета, похожее на грамотный софт — либо устаревший и нерабочий, либо напичкан вирусами, шпионами и прочими.

Итак, Вашему вниманию предлагается современная программа, которая поможет определить координаты, цвет пикселя и многое другое.

Функционал программы.

Навести курсор мышки на любое место экрана и нажать «Ctrl+1». Программа покажет:

1. Точные координаты курсора мышки.
2. Определит цвет пикселя под курсором в формате RGB.

Дополнительные возможности.

1. Возможность выбрать размер прямоугольника до 100 на 100 пикселей.
2. Программа отобразит выбранный участок в окне.
3. Программа рассчитает средний пиксель (сумму всех пикселей прямоугольника).
4. Программа отобразит значение среднего пикселя в RGB.
5. Программа визуально покажет цвет среднего пикселя в окне (смешать/объединить цветов всех пикселей).

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

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

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

Узнать стоимость программы, оплатить и получить копию программы для определения координат и цвета пикселя на экране Вы можете написав на почту admin@tapbot.ru или по любому удобному каналу связи. Ссылки в подвале сайта.

Видео работы программы:

Понравилась статья? Поделить с друзьями:
  • Видео как нашли пикачу
  • Как найти площадь невыпуклого четырехугольника
  • Как найти дробную часть чисел
  • Как найти налоговую базу за год
  • Как исправить ошибку ts4 в симс 4