在Python中对Image数组中的像素进行分组

时间:2016-05-11 18:14:22

标签: python arrays numpy tuples

我有一个numpy数组 - 从图像 - 这个形状:

    Arr = 
    array([[[ 61,  61,  61],
    [ 60,  60,  60],
    [ 60,  60,  60],
    ..., 
    [203, 203, 203],
    [201, 201, 201],
    [199, 199, 199]],
     .
     .
     .    

   [[204, 204, 204],
    [204, 204, 204],
    [204, 204, 204],
    ..., 
    [205, 205, 205],
    [206, 206, 206],
    [207, 207, 207]]], dtype=uint8)

我想在不同长度的“元组”中使用此数组,例如5(而不仅仅是当前的3):

    array([[[ 61,  61,  61, 60, 60],
    [ 60,  60,  60, 60, 60],
    .
    .
    .

函数元组()似乎是用于列表的,并且在任何情况下它都不提供确定一组像素长度的选项。我也尝试使用zip(),因此:

    newArr = zip(*[Arr[i::n] for i in range(n)]). For n=5, it gives:
    newArr = 
    [(array([[ 61,  61,  61],
     [ 60,  60,  60],
     [ 60,  60,  60],
     ..., 
     [203, 203, 203],
     [201, 201, 201],
     [199, 199, 199]], dtype=uint8), array([[ 63,  63,  63],
     [ 62,  62,  62],
     [ 62,  62,  62],
     .
     .
     .
      [207, 207, 207],
     [209, 209, 209],
     [210, 210, 210]], dtype=uint8), array([[204, 204, 204],
     [204, 204, 204],
     [205, 205, 205],
     ..., 
     [206, 206, 206],
     [207, 207, 207],
     [208, 208, 208]], dtype=uint8))]

出于什么方式?这是图像:image used in this case

1 个答案:

答案 0 :(得分:1)

将值分组为三个的原因是因为这些是颜色通道的值,RGB,HSV或任何格式。每个像素都有三个值,这就是为什么你不能以任何其他方式将它们分组的原因。您可以使用以下方法将图像转换为灰度:

from PIL import Image
import numpy as np

img = Image.open('imagename')
img2 = img.convert('L')
img2_array = np.asarray(img2).copy()

这会将每个像素的值更改为单个整数(0-255),并为您提供具有图像本身尺寸的数组。

修改 要将图像分割为五个像素组:

seg = 5
img2_array = img2_array.tolist()
img_grouped = np.array([img2_array[0][x:x+seg] for x in range(0,len(img2_array),seg)])