我正在尝试从屏幕的特定位置读取图像数据,因此可以以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
数组)。我在做错什么吗?
答案 0 :(得分:2)
我认为您
(bbox=798, 166, 300, 400))
x = 798 在您的屏幕上
所以您必须在屏幕上输入(x,y)。
看这张照片: enter image description here 结果为“无”,因为它无法捕获您的屏幕
当我修改x = 100时,它可以工作 enter image description here
代码:
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)
右侧的x坐标并在屏幕上可以正常工作
对于第一个问题,我很抱歉,右边是这里
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。因此必须将width> x和height> y设置为可用
要转换为灰度图像,可以使用opencv
import cv2
gray=cv2.cvtColor(img_np,cv2.COLOR_RGB2GRAY)[enter link description here][3]
链接 要么 PIL convert(“ 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]))
答案 1 :(得分:0)
@马俊指出 (bbox = x,y,width,height)并不是真的像从(x,y)开始并获得宽度到高度的窗口。 而是打开的窗口是x,y宽度x,高度y 我添加了这篇文章,因为花了很长时间我才弄清楚了:) 关键字:Python ImageGrab bbox