我有一个小的80x80像素灰度图像,如下所示;
我使用以下代码将此图像展平为矢量;
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')
然而,这似乎给了我这样的文件;
我哪里错了?
答案 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)
修改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)
>>> ===============================