从 ImageGrab 定位黑色像素的位置
Locating Position of Black Pixels from ImageGrab
我目前正在创建一个 PianoTiles AI,它必须从 ImageGrab 中定位所有黑色像素。我已经获得了 Image Grab 的所有位置,但是我需要找出那里是否有黑色像素,如果有,它们在哪里,以便我的 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))
我只需要上面的代码就可以工作并给我黑色像素的位置。
您的 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,您可以将其更改为其他阈值。
您应该尽量避免遍历图像并使用 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))
我目前正在创建一个 PianoTiles AI,它必须从 ImageGrab 中定位所有黑色像素。我已经获得了 Image Grab 的所有位置,但是我需要找出那里是否有黑色像素,如果有,它们在哪里,以便我的 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))
我只需要上面的代码就可以工作并给我黑色像素的位置。
您的 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,您可以将其更改为其他阈值。
您应该尽量避免遍历图像并使用 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))