Расположение положения черных пикселей из ImageGrab - PullRequest
0 голосов
/ 17 февраля 2019

В настоящее время я создаю AI PianoTiles, который должен найти все черные пиксели из ImageGrab.У меня есть все позиции Image Grab, но мне нужно выяснить, есть ли там черные пиксели и если да, то где они находятся, чтобы мой ИИ мог щелкнуть по ним.Ниже я выложил фрагмент кода.

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

from PIL import ImageGrab, ImageOps    

class Coordinates:    
    lines = [    
    (520, 300, 525, 760),    
    (630, 300, 635, 760),    
    (740, 300, 745, 760),    
    (850, 300, 855, 760)]    
    restartcheck = (660, 590, 725, 645)    
    restartbtn = (695, 615)    


blackpixelpositions = []    

def findtiles():    
    for line in Coordinates.lines:  
        i = ImageGrab.grab(line)  
        for pixel in i.getdata():  
            #if pixel is black  
            # x, y = pixel position  
             blackpixelpositions.append((x,y))  

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

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

Как правило, лучше преобразовать изображение PIL в массив Numpy, а затем использовать векторизованные процедуры Numpy для обработки изображений.Итак, в конкретных терминах, скажем, вы получаете изображение PIL либо путем захвата экрана, либо открыв файл:

im = Image.open('someFile.png')

, затем вы можете создать массив Numpy из изображения следующим образом:

n = np.array(im)

и ищите черные пиксели следующим образом:

blacks = np.where((n[:, :, 0:3] == [0,0,0]).all(2)))

, который даст вам массив x координат и массив y координат черных пикселей, например, вы можете сделать:

xcoords, ycoords = np.where((n[:, :, 0:3] == [0,0,0]).all(2))
0 голосов
/ 17 февраля 2019

У вас есть проблема с i.getdata (), из-за которой данные сглаживаются, т.е. вы теряете координаты пикселей (если вы не отслеживаете вручную).так что вы будете знать только, что существует черный пиксель, но не где.Вместо этого вы можете использовать getpixel:

def get_black_pixels(image):
    found = []
    width, height = image.size
    for y in range(height):
        for x in range(width):
            if all(map(lambda x: x < 20, image.getpixel((x,y)))):
                found.append((x,y))
    return found

Строка:

all(map(lambda x: x < 20, image.getpixel((x,y))))

просто проверяет, что все значения (r, g, b) меньше 20, что вы можете изменить на другоепороговое значение.

...