从ImageGrab定位黑色像素的位置



我当前正在创建一个钢琴AI,它必须从ImageGrab找到所有黑色像素。我已经得到了图像的所有位置,但是我需要找出那里是否有黑色像素,如果是的,那么我的AI可以单击它们。波纹管我已经放了一个代码的剪子。

我已经在网络周围环顾了,但找不到任何东西。我认为代码是这样的。

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))  

我只需要上述代码来工作并给我黑色像素位置。

您应该尝试避免在图像上循环并使用诸如 getpixel()之类的功能访问每个像素,因为它是真的很慢 - 尤其是对于大图像而言,尤其是对于大图像现代4-5k屏幕。

通常最好将您的PIL图像转换为Numpy数组,然后使用矢量化的Numpy例程来处理您的图像。因此,用具体的话说,假设您通过屏幕上的屏幕或打开文件获得了PIL图像:

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

然后,您可以从这样的图像中制作一个数组:

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))

您对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,您可以更改为其他一些阈值。

相关内容

  • 没有找到相关文章

最新更新