Захватите изображение с экрана в массив и отобразите его как черно-белое изображение - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь прочитать данные изображения с определенной части экрана, чтобы я мог обработать их в виде массива numpy.Это то, что я пробовал до сих пор:

import numpy as np
from PIL import ImageGrab, Image

img = ImageGrab.grab(bbox=(798, 166, 300, 400))  # (bbox=x,y,width,height)
img_np = np.array(img)

Но когда я пытаюсь напечатать img_np, он возвращает:

<PIL.Image.Image image mode=RGB size=0x234 at 0x109F8F0>

Не похоже, что это numpyмассив.Я также хочу отобразить черно-белое изображение из массива numpy, чтобы убедиться в правильности моих действий (а также отобразить обработанные массивы numpy в будущем).Что-то я делаю не так?

1 Ответ

0 голосов
/ 13 сентября 2018

Я думаю, что ваш

(bbox=798, 166, 300, 400))

x = 798 находится над вашим экраном

, поэтому вы должны указать (x, y) на своем экране.

посмотрите эту картинку: введите описание изображения здесь результат - Нет, потому что он не может захватить ваш экран

, и когда я изменяю x = 100, он работает введите описание изображения здесь

код:

import numpy as np 
from PIL import ImageGrab,Image 
img=ImageGrab.grab(bbox=(798,166,300,400))  #798
# img=Image.open("Modric.jpg")
print(type(img))
img_np=np.array(img)
print(type(img_np))
print(img_np.shape)

результат:

<class 'PIL.Image.Image'>
<class 'numpy.ndarray'>
()      *******None

после x = 100 :

import numpy as np 
from PIL import ImageGrab,Image 
img=ImageGrab.grab(bbox=(100,166,300,400))  #798
# img=Image.open("Modric.jpg")
print(type(img))
img_np=np.array(img)
print(type(img_np))
print(img_np.shape) code here

результат:

<class 'PIL.Image.Image'>
<class 'numpy.ndarray'>
(234, 200, 3)

правильная координата х и на экране, он может работать


Извините за первый вопрос, право здесь

import tkinter
win=tkinter.Tk()
width=win.winfo_screenwidth()   #get your screen's width
height=win.winfo_screenheight() #get your screen's height  
print(width,height)                            
img=ImageGrab.grab(bbox=(300,400,width,height)).convert("L")  #798
img_np=np.array(img)
print(img_np.shape)

результат:

1536 864
(464, 1236)

, когда вы используете bbox = (x, y, width, height), метод подсчета пикселей - width-x и height-y.поэтому вы должны задать ширину> x и высоту> y, и она будет работать


. Для преобразования в серое изображение вы можете использовать opencv

import cv2
gray=cv2.cvtColor(img_np,cv2.COLOR_RGB2GRAY)[enter link description here][3]

link или функция преобразования PIL ("L")

img=ImageGrab.grab(bbox=(300,400,width,height)).convert("L")  #798

 or

формула:

def rgb2gray(rgb):
"""
gray=0.299*R+0.587*G+0.144*B
"""
return np.uint8(np.dot(rgb[...,:3], [0.299, 0.587, 0.114]))
...