将Sklearn数字大小从8 * 8扩展到32 * 32

时间:2018-02-08 08:44:47

标签: python numpy matplotlib image-processing scikit-learn

我有一个问题,即将Sklearn数字数据集位的大小从8 * 8扩展到32 * 32像素。

我的方法是采用8 * 8阵列,然后展平并展开它。也就是说,总共从64像素放大到1024像素。因此,我只想将每行的值乘以16次:

  1. 创建一个具有1024个NaN值的新数组(= newfeatures)。
  2. 将newfeatures数组的每16个值替换为原始数组的值,即(0 = 0),(16 = 1),(32 = 2),(...),(1008 = 64) )。 3.用dropna(ffill)替换剩余的NaN值到"展开"原始图像为32 * 32像素图像。
  3. 因此我使用以下代码:

    #Load in the training dataset
    
    digits=datasets.load_digits()
    features=digits.data
    targets=digits.target
    
    #Plot original digit
    ax[0].imshow(features[0].reshape((8,8)))
    

    enter image description here

    #Expand 8*8 image to a 32*32 image (64 to 1024)
    
    newfeatures=np.ndarray((1797,16*len(features[0])))
    newfeatures[:]=np.NaN
    newfeatures=pd.DataFrame(newfeatures)
    for row in range(1797):
        for i in range(0,63):
            newfeatures.iloc[row,16*i]=features[row][i]
    newfeatures.fillna(method="ffill",axis=1,inplace=True)
    
    #Plot expanded image with 32*32 pixels
    ax[1].imshow(newfeatures.values[0].reshape((32,32)))
    

    enter image description here

    如您所见,结果不符合预期

2 个答案:

答案 0 :(得分:1)

你可以使用skimage&#res;大小调整,如下所示

from skimage import transform
new_features = np.array(list
                        (map
                         (lambda img: transform.resize(
                                        img.reshape(8,8),#old shape
                                          (32, 32), #new shape
                                          mode='constant',
                                         #flatten the resized image
                                          preserve_range=True).ravel(),
             features)))

new_features形状将为(1797,1024)并显示第一张图像 enter image description here

答案 1 :(得分:0)

基于上述解决方案,我认为以下是更简洁的方式:

from skimage import transform

newfeatures=[transform.resize(features[i].reshape(8,8),(32,32))for i in 
range(len(features))]

plt.imshow(newfeatures[0].reshape((32,32)))

enter image description here