Python-获取图像区域的平均RGB分量

Python-获取图像区域的平均RGB分量,python,numpy,python-imaging-library,Python,Numpy,Python Imaging Library,我需要计算图像的平均红色、绿色和蓝色分量值。图像不一定是正方形的。它也可以是长方形的 图像分为4个象限,每个象限进一步分为2个三角形区域,这样图像中总共有8个区域(P1-P8) 到目前为止,我已经获得了图像(主监视器屏幕截图),并将rgb值转换为numpy数组 从那里我不确定得到三角形区域的最佳方法,因为我需要这个操作每秒至少进行3次 有什么想法吗 import subprocess import numpy import pyscreenshot as ImageGrab #GET THE

我需要计算图像的平均红色、绿色和蓝色分量值。图像不一定是正方形的。它也可以是长方形的

图像分为4个象限,每个象限进一步分为2个三角形区域,这样图像中总共有8个区域(P1-P8)

到目前为止,我已经获得了图像(主监视器屏幕截图),并将rgb值转换为numpy数组

从那里我不确定得到三角形区域的最佳方法,因为我需要这个操作每秒至少进行3次

有什么想法吗

import subprocess
import numpy
import pyscreenshot as ImageGrab

#GET THE PRIMARY MONITOR RESOLUTION
output = subprocess.Popen('xrandr | grep "\*" | cut -d" " -f4',shell=True, stdout=subprocess.PIPE).communicate()[0]
primary_monitor_x = output.split("\n")[0].split("x")[0].strip()
primary_monitor_y = output.split("\n")[0].split("x")[1].strip()
print "primary monitor X = " + primary_monitor_x + "px"
print "primary monitor Y = " + primary_monitor_y + "px"

print ""
print ""

x_max = int(primary_monitor_x)
y_max = int(primary_monitor_y)

#GET SCREEN IMAGE IN A PIL IMAGE
im = ImageGrab.grab(bbox=(0,0,x_max,  y_max))
#CONVERT IMAGE TO RGB MODE
rgb_im = im.convert('RGB')

#CONVERT IMAGE TO NUMPY 2D ARRAY WITH EACH ELEMENT AS PIXEL RGB TUPLE
img_rgb_array = numpy.array(rgb_im);

#THE SCREEN IS DIVIDED INTO 8 PARTS. FOR EACH PART, THE AVERAGE VALUE
#OF RED, GREEN, BLUE COLOR COMPONENT WILL BE CALCULATED
# -------------------------
# - Q1        +        Q2 -   
# -        P8 + P1        -
# -      P7   +    P2     -
# -+++++++++++++++++++++++-
# -      P6   +    P3     -
# -        P5 + P4        -
# - Q4        +        Q3 -
# -------------------------

#SLICE THE IMAGE RGB ARRAY INTO 4 SMALLER QUADRANT ARRAYS
img_rgb_arraq_q1 = img_rgb_array[0:(y_max/2), 0:(x_max/2)]
img_rgb_arraq_q2 = img_rgb_array[0:(y_max/2), (x_max/2):x_max]
img_rgb_arraq_q3 = img_rgb_array[(y_max/2):y_max, (x_max/2):x_max]
img_rgb_arraq_q4 = img_rgb_array[(y_max/2):y_max, 0:(x_max/2)]

对于第二季度和第四季度的正方形,您可以执行以下操作

import numpy as np

n = 5
a = np.arange(n**2).reshape((n,n))

idx = np.fromfunction(lambda i,j: i+j<n, (n,n))
# use i+j<n-1 if the diagonal should go to the lower triangular

a_upper = a.copy()
a_upper[np.logical_not(idx)] = 0

a_lower = a.copy()
a_lower[idx] = 0

print a_upper
print a_lower
将numpy导入为np
n=5
a=np.arange(n**2)。重塑(n,n))

idx=np.fromfunction(lambda i,j:i+j你如何决定哪些元素进入上/下三角部分?特别是如果象限不是正方形的话?谢谢!我对python不是很精通,所以我在解释器中尝试了这一点,这正是我想要的。你能解释一下
np.formfunction
的作用吗?是从函数构造数组吗作为第一个参数,它本身使用数组元素的索引计算数组元素。我刚刚注意到,您显然希望旋转Q1和Q3,而不是转置它。我在答案中更正了这一点。是的。我计算了旋转部分。谢谢,关于lambda的解释!
import numpy as np

n = 5
a = np.arange(n**2).reshape((n,n))

idx = np.fromfunction(lambda i,j: i+j<n, (n,n))
# use i+j<n-1 if the diagonal should go to the lower triangular

a_upper = a.copy()
a_upper[np.logical_not(idx)] = 0

a_lower = a.copy()
a_lower[idx] = 0

print a_upper
print a_lower
n, m = 3,5
a = np.arange(n*m).reshape((n,m))

idx = np.fromfunction(lambda i,j: i/(n-1.) + j/(m-1.) <= 1, (n,m))

a_upper = a.copy()
a_upper[np.logical_not(idx)] = 0

a_lower = a.copy()
a_lower[idx] = 0

print a_upper
print a_lower