用matplotlib读图像

时间:2016-02-07 14:42:54

标签: python python-2.7 matplotlib scikit-learn

所以我正在玩:http://scikit-learn.org/stable/auto_examples/classification/plot_digits_classification.html#example-classification-plot-digits-classification-py

我试图从我的磁盘加载图像,我使用绘画在8x8 png图像中绘制一个数字。

scikit-learn图像看起来像这样:

[[  0.   0.   5.  13.   9.   1.   0.   0.]
 [  0.   0.  13.  15.  10.  15.   5.   0.]
 [  0.   3.  15.   2.   0.  11.   8.   0.]
 [  0.   4.  12.   0.   0.   8.   8.   0.]
 [  0.   5.   8.   0.   0.   9.   8.   0.]
 [  0.   4.  11.   0.   1.  12.   7.   0.]
 [  0.   2.  14.   5.  10.  12.   0.   0.]
 [  0.   0.   6.  13.  10.   0.   0.   0.]]

其中0为白色,值越大,像素越暗。 当我加载图像时,我得到了这个:

[[[ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 0.85882354  0.85882354  0.85882354]
  [ 0.14901961  0.14901961  0.14901961]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]]

 [[ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 0.56862748  0.56862748  0.56862748]
  [ 0.22745098  0.22745098  0.22745098]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]]

 [[ 1.          1.          1.        ]
  [ 0.9254902   0.9254902   0.9254902 ]
  [ 0.13725491  0.13725491  0.13725491]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]]

 [[ 1.          1.          1.        ]
  [ 0.53725493  0.53725493  0.53725493]
  [ 0.63137257  0.63137257  0.63137257]
  [ 0.62352943  0.62352943  0.62352943]
  [ 0.97254902  0.97254902  0.97254902]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]]

 [[ 1.          1.          1.        ]
  [ 0.36078432  0.36078432  0.36078432]
  [ 0.18431373  0.18431373  0.18431373]
  [ 0.72941178  0.72941178  0.72941178]
  [ 0.07843138  0.07843138  0.07843138]
  [ 0.86274511  0.86274511  0.86274511]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]]

 [[ 1.          1.          1.        ]
  [ 0.29411766  0.29411766  0.29411766]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 0.42352942  0.42352942  0.42352942]
  [ 0.80000001  0.80000001  0.80000001]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]]

 [[ 1.          1.          1.        ]
  [ 0.19607843  0.19607843  0.19607843]
  [ 0.96470588  0.96470588  0.96470588]
  [ 0.90980393  0.90980393  0.90980393]
  [ 0.08627451  0.08627451  0.08627451]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]]

 [[ 1.          1.          1.        ]
  [ 0.96862745  0.96862745  0.96862745]
  [ 0.28627452  0.28627452  0.28627452]
  [ 0.35686275  0.35686275  0.35686275]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]
  [ 1.          1.          1.        ]]]

是否有内置函数以类似于scikit-learn图像的格式转换它?或者我应该编写自己的转换函数吗?

有人可以解释一下imread输出的含义吗?我有8个8x3 2D阵列,我无法弄清楚它是什么。

文档说这是MxN,但我不知道MxN的含义。 http://matplotlib.org/api/image_api.html#matplotlib.image.imread

由于

修改

所以这是我做的代码,感谢ali_m

from numpy import array

def loadImageFromDisk(image_path):

    def convertImreadImage(img):
        """
        Convert imread images to scikit-learn images
            -img : a 2 dimension array (regular or numpy array)
            -return : a 2 dimension numpy array where 0 is white and
                      the higher the value the darker the pixel
        """
        res = []
        for row in img:
            newRow = []
            for value in row:
                if value == 1.:
                    newRow.append(0)
                else:
                    newRow.append(math.floor((100-value*100)/5))
            res.append(newRow)
        return array(res)

    #needs to be a absolute path
    img = mpimg.imread(image_path)[:, :, 0]
    return convertImreadImage(img)

输出8x8 png文件中的6:

[[  0.   0.   0.   2.  19.   0.   0.   0.]
 [  0.   0.   2.  20.  13.   0.   0.   0.]
 [  0.   1.  20.  16.   0.   0.   0.   0.]
 [  0.  15.  20.  20.  16.   3.   0.   0.]
 [  0.  20.  20.   1.  18.  20.   0.   0.]
 [  0.  20.   9.   0.   1.  20.   0.   0.]
 [  0.  20.   9.   2.  17.  18.   0.   0.]
 [  0.   6.  20.  20.  19.   0.   0.   0.]]

1 个答案:

答案 0 :(得分:0)

看起来imread正在为您提供一个8x8x3阵列,其中最终尺寸对应于红色,绿色和蓝色通道(由于您在Paint中制作的图像为灰度,因此它们都相同)。顺便说一句,对于具有>的阵列通过检查.shape属性而不是将其内容打印到终端,可以更容易地判断其形状。

要获得8x8阵列,您可以将第一个颜色通道编入索引,例如im[:, :, 0]其中imimread返回的8x8x3数组。