展平和取消图像

时间:2017-10-07 15:29:25

标签: python python-imaging-library

我有一个小的80x80像素灰度图像,如下所示;

enter image description here

我使用以下代码将此图像展平为矢量;

o = numpy.array(a)
o = o.flatten()
o = o/256

a 是上面显示的图像。然后我想将它转换回图像(我计划在两者之间做一些工作,但那是在点atm旁边 - 我只读取像素,而不是改变它们)。要做到这一点,我已经尝试过了;

tmp = test_set_x[i]
tmp = tmp * 256
tmp.shape = (tmp.size//80, 80)
img = Image.fromarray(tmp, 'L')
img.save('imgOut' + str(cntr) + '.bmp')

然而,这似乎给了我这样的文件;

enter image description here

我哪里错了?

2 个答案:

答案 0 :(得分:0)

你可以得到已经扁平的数组:

size = a.size
o = np.fromstring(a.tobytes())

# Do on o whatever you like and then:
a = Image.frombytes("L", size, o.astype(np.int8).tostring())

应该比逐像素地获取新数组更快。

答案 1 :(得分:0)

如果您只想展平图像阵列然后执行数组操作(更改像素值等),那么scipy可以使用非常直接的模块。

例如,使用scipy.ndimage.imread,您可以直接读取并展平数组。如果需要,甚至可以选择不同的模式。

返回的numpy数组可用于像素的任何中间操作。

完成后,我们可以使用scipy.misc.imsave保存图片。

下面是一个示例代码,用于读取您的图像,为每个像素添加(0.5值)(因此稍微点亮它),然后将文件保存回来。

from scipy.ndimage import imread
from  scipy.misc import imsave

#read and flatten image
a = imread('sample.png' , flatten = True, mode=None)

#Add 0.5 to numpy array to lighten it.
a = a * 0.5

#save the modified pixel array
imsave('out.png', a)

numpy数组数据和图像

>>> a
array([[  36.,   36.,   36., ...,   17.,   18.,   18.],
       [  36.,   36.,   36., ...,   22.,   22.,   20.],
       [  37.,   37.,   37., ...,   26.,   25.,   24.],
       ..., 
       [ 110.,  119.,  130., ...,   17.,   17.,   18.],
       [ 115.,  106.,  113., ...,   14.,   15.,   16.],
       [ 119.,  114.,  101., ...,   15.,   13.,   13.]], dtype=float32)

enter image description here

修改numpy数组后的图像

>>> a.shape
(80, 80)
>>> a = a * 0.5
>>> a
array([[ 18. ,  18. ,  18. , ...,   8.5,   9. ,   9. ],
       [ 18. ,  18. ,  18. , ...,  11. ,  11. ,  10. ],
       [ 18.5,  18.5,  18.5, ...,  13. ,  12.5,  12. ],
       ..., 
       [ 55. ,  59.5,  65. , ...,   8.5,   8.5,   9. ],
       [ 57.5,  53. ,  56.5, ...,   7. ,   7.5,   8. ],
       [ 59.5,  57. ,  50.5, ...,   7.5,   6.5,   6.5]], dtype=float32)
>>> ===============================

enter image description here