精华内容
下载资源
问答
  • numpy保存图片方法及速度对比 最近遇到一个问题,有大量小图片需要保存,分析了一下代码,发现写入图片这个操作很耗时。于是想对比几种存储方法的性能。 参赛选手有:opencv、matplotlib、PIL、imageio import ...

    numpy保存为图片方法及速度对比
    最近遇到一个问题,有大量小图片需要保存,分析了一下代码,发现写入图片这个操作很耗时。于是想对比几种存储方法的性能。
    参赛选手有:opencv、matplotlib、PIL、imageio

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    from PIL import Image
    import imageio
    from line_profiler import LineProfiler
    
    def saveimg(img):
        for i in range(100):
            #CV2
            cv2.imwrite('datatest/' + str(i) + '_cv2.jpg', img)
            #matplotlib
            plt.imsave('datatest/' + str(i) + '_matplotlib.jpg', img)
            #PIL
            im = Image.fromarray(img)
            im.save('datatest/' + str(i) + '_PIL.jpg')
            #imageio
            imageio.imsave('datatest/' + str(i) + '_imageio.jpg', img)
    
    
    
    if __name__ == '__main__':
        img = np.random.randint(0, 255, size = [100,100,3], dtype ='uint8' )
        lp = LineProfiler()
        lp_wrapper = lp(saveimg)
        lp_wrapper(img)
        lp.print_stats()
        # saveimg(img)
    

    输入结果看:

    Line #      Hits         Time  Per Hit   % Time  Line Contents
    ==============================================================
         8                                           def saveimg(img):
         9       101       1756.0     17.4      0.0      for i in range(100):
        10                                                   #CV2
        11       100     604846.0   6048.5     14.2          cv2.imwrite('datatest/' + str(i) + '_cv2.jpg', img)    
        12                                                   #matplotlib
        13       100    1426342.0  14263.4     33.4          plt.imsave('datatest/' + str(i) + '_matplotlib.jpg', img)
        14                                                   #PIL
        15       100      70824.0    708.2      1.7          im = Image.fromarray(img)
        16       100     847999.0   8480.0     19.8          im.save('datatest/' + str(i) + '_PIL.jpg')
        17                                                   #imageio
        18       100    1320907.0  13209.1     30.9          imageio.imsave('datatest/' + str(i) + '_imageio.jpg', img)
    

    opencv最快,14%
    其次是PIL,21%
    然后是imageio,30%
    最慢的是plt,33%

    和想象中的结果差不多。

    展开全文
  • Python.Numpy图片处理(读取,变换,保存) 使用Numpy的ndarray可以读取图片文件,并且可以对图片进行各种各样的处理。 例如:图片像素值的读取,替换,随机剪裁,拼接等等都可以使用ndarray。对于已经习惯使用...

    Numpy的图片处理(读取,变换,保存)

    使用Numpy的ndarray可以读取图片文件,并且可以对图片进行各种各样的处理。
    例如:图片像素值的读取,替换,随机剪裁,拼接等等都可以使用ndarray。对于已经习惯使用Numpy的人们来说,已经可以不使用OpenCV进行图像处理。

    即便是使用OpenCV进行图片处理的时候,OpenCV图像的读取也是使用的ndarray形式,所以直接使用Numpy将会更加的方便与快捷。

    在此:对图片文件的基础读取,保存方法进行介绍

    • Numpy图片文件的读取方法
    • Numpy图片文件的保存方法

    和一些Numpy的图像处理的实例进行介绍

    • 像素值的读取和修改
    • 图片的单色化和图片的拼接
    • 减色处理
    • 二值化处理
    • 四则演算
    • 切片修剪
    • 按切片或函数的拆分
    • 切片粘贴
    • Alpha混合和遮罩处理
    • 旋转和上/下/左/右 反转
      等等进行说明。

    图片文件读取(Numpy的ndarray形式)


    使用以下的图片为例。
    在这里插入图片描述
    np.array中调用PIL.Image.open()函数进行读取,并且可以查看数据的类型和形状(shape,行(高),列(宽),色(通道数))等信息。
    需要注意的是色(通道数)的读取顺序是RGB(红,绿,蓝)。而OpenCV的cv2.imread()的读取顺序是(BGR),稍有不同。

    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open('./data/01/lena.jpg'))
    
    print(type(im))
    # <class 'numpy.ndarray'>
    
    print(im.dtype)
    # uint8
    
    print(im.shape)
    # (225, 400, 3)
    

    convert(‘L’)函数可以把图片转换成黑白图片(灰度图)之后,将图片作为2维数据进行读取。
    此时形状只剩下了行(高)和列(宽)。

    im_gray = np.array(Image.open('./data/01/lena.jpg').convert('L'))
    
    print(im_gray.shape)
    # (225, 400)
    

    使用np.asarray()同样可以返回得到一个ndarray的数组。但是使用np.array()返回的是一个允许被更改的ndarray,np.asarray()返回的ndarra不允许被更改。

    '''np.array()'''
    print(im.flags.writeable)
    # True
    
    print(im[0, 0, 0])
    # 109
    
    im[0, 0, 0] = 0
    
    print(im[0, 0, 0])
    # 0
    '''np.asarray()'''
    im_as = np.asarray(Image.open('./data/01/lena.jpg'))
    
    print(type(im_as))
    # <class 'numpy.ndarray'>
    
    print(im_as.flags.writeable)
    # False
    
    # im_as[0, 0, 0] = 0
    # ValueError: assignment destination is read-only
    

    图片的数据类型是以uint8(8位无符号整型)进行的读取。若想以float类型进行读取时,可以使用astype()进行转换,或者指定np.array()和np.asarray()的第2个参数(指定类型的读取)。

    im_f = im.astype(np.float64)
    print(im_f.dtype)
    # float64
    
    im_f = np.array(Image.open('./data/01/lena.jpg'), np.float64)
    print(im_f.dtype)
    # float64
    

    图片文件保存(Numpy的ndarray形式)


    使用Image.fromarray()函数读取ndarray数据时,可以得到一个PIL.Image类型的文件。再使用save()函数可以将其保存下来。被保存的文件格式,将根据其指定的扩展名自动进行判别。

    pil_img = Image.fromarray(im)
    print(pil_img.mode)
    # RGB
    
    pil_img.save('./data/01/lena_save_pillow.jpg')
    

    黑白图片的保存也可以。

    pil_img_gray = Image.fromarray(im_gray)
    print(pil_img_gray.mode)
    # L
    
    pil_img_gray.save('./data/01/lena_save_pillow_gray.jpg')
    

    简洁的写法

    Image.fromarray(im).save('./data/01/lena_save_pillow.jpg')
    Image.fromarray(im_gray).save('./data/01/lena_save_pillow_gray.jpg')
    

    float类型进行保存时,有可能会出现错误。此时,需要将其类型转换成uint8之后,再保存。

    # pil_img = Image.fromarray(im_f)
    # TypeError: Cannot handle this data type
    
    pil_img = Image.fromarray(im_f.astype(np.uint8))
    pil_img.save('./data/01/lena_save_pillow.jpg')
    

    使用astype()进行类型转换保存的时候,不会进行比例的缩放,所以当像素值为0.0-1.0之间的时候,需要先将其乘以255,再保存。

    像素值的读取和修改


    index[]可以取得指定坐标点的像素值。指定的顺序是行,列。xy的话,y,x的顺序指定。原点(0,0)为图片的左上角。

    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open('./data/01/lena.jpg'))
    
    print(im.shape)
    # (225, 400, 3)
    
    print(im[100, 150])
    # [111  81 109]
    
    print(type(im[100, 150]))
    # <class 'numpy.ndarray'>
    

    上述的实例中,(y,x)=(100,150)为第100行,150列的像素值。和上述的一样,使用Pillow,ndarray数组读取时,颜色的排列读取顺序为RGB,(R,G,B)=(110,81,109)。

    R, G, B = im[100, 150]
    
    print(R)
    # 111
    
    print(G)
    # 81
    
    print(B)
    # 109
    

    index[]指定像素值的读取。

    print(im[100, 150, 0])
    # 111
    
    print(im[100, 150, 1])
    # 81
    
    print(im[100, 150, 2])
    # 109
    

    修改像素值的时候,可以RGB三色同时进行修改,或者单色修改。

    im[100, 150] = (0, 50, 100)
    
    print(im[100, 150])
    # [  0  50 100]
    
    im[100, 150, 0] = 150
    
    print(im[100, 150])
    # [150  50 100]
    

    在实际的日常操作中,通常是对图片整体或者是切片的部分进行操作,对单个像素值的操作并不常见。

    图片的单色化和拼接


    其他的像素值修改为0,单色图片的生成,以及横向的图片拼接。

    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open('./data/01/lena_square.png'))
    
    im_R = im.copy()
    im_R[:, :, (1, 2)] = 0
    im_G = im.copy()
    im_G[:, :, (0, 2)] = 0
    im_B = im.copy()
    im_B[:, :, (0, 1)] = 0
    
    # 向的图片拼接
    im_RGB = np.concatenate((im_R, im_G, im_B), axis=1)
    # im_RGB = np.hstack((im_R, im_G, im_B))
    # im_RGB = np.c_['1', im_R, im_G, im_B]
    
    pil_img = Image.fromarray(im_RGB)
    pil_img.save('./data/01/lena_numpy_split_color.jpg')
    

    处理结果
    在这里插入图片描述

    像素值的反转


    用像素值的最大值(uint8类型)255减去其像素值。

    import numpy as np
    from PIL import Image
    
    im = np.array(Image.open('./data/01/lena_square.png').resize((256, 256)))
    
    im_i = 255 - im
    
    Image.fromarray(im_i).save('./data/01/lena_numpy_inverse.jpg')
    

    在这里插入图片描述
    减色处理


    用//求其舍去余数值之后,再次相乘。则像素值为离散值,并且可以减少颜色的数量。

    import numpy as np
    from PIL import Image
    
    im = np.array(Image.open('./data/01/lena_square.png').resize((256, 256)))
    
    im_32 = im // 32 * 32
    im_128 = im // 128 * 128
    
    im_dec = np.concatenate((im, im_32, im_128), axis=1)
    
    Image.fromarray(im_dec).save('./data/01/lena_numpy_dec_color.png')
    

    在这里插入图片描述
    二值化处理


    设定一个中间值,对图片进行非黑即白的二值化处理
    在这里插入图片描述

    四则运算


    乘法,除法,累乘等计算。
    函数可以对图片全体进行计算,所以无需使用for等循环函数。

    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open('./data/01/lena_square.png'))
    
    im_1_22 = 255.0 * (im / 255.0)**(1 / 2.2)
    im_22 = 255.0 * (im / 255.0)**2.2
    
    im_gamma = np.concatenate((im_1_22, im, im_22), axis=1)
    
    pil_img = Image.fromarray(np.uint8(im_gamma))
    pil_img.save('./data/01/lena_numpy_gamma.jpg')
    

    在这里插入图片描述
    计算的结果ndarray类型为float类型。所以最后保存时,需要先转换成uint8类型之后,再保存。

    切片修剪


    指定范围的矩形切片。

    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open('./data/01/lena_square.png'))
    
    print(im.shape)
    # (512, 512, 3)
    
    im_trim1 = im[128:384, 128:384]
    print(im_trim1.shape)
    # (256, 256, 3)
    
    Image.fromarray(im_trim1).save('./data/01/lena_numpy_trim.jpg')
    

    在这里插入图片描述
    以左上角为原点,指定宽和高的裁剪。

    def trim(array, x, y, width, height):
        return array[y:y + height, x:x+width]
    
    im_trim2 = trim(im, 128, 192, 256, 128)
    print(im_trim2.shape)
    # (128, 256, 3)
    
    Image.fromarray(im_trim2).save('./data/01/lena_numpy_trim2.jpg')
    

    在这里插入图片描述
    按切片或函数的拆分


    可以使用切片分割图片。与从图片边裁进行裁剪相同。

    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open('./data/01/lena_square.png').resize((256, 256)))
    
    print(im.shape)
    # (256, 256, 3)
    
    im_0 = im[:, :100]
    im_1 = im[:, 100:]
    
    print(im_0.shape)
    # (256, 100, 3)
    
    print(im_1.shape)
    # (256, 156, 3)
    
    Image.fromarray(im_0).save('./data/01/lena_numpy_split_0.jpg')
    Image.fromarray(im_1).save('./data/01/lena_numpy_split_1.jpg')
    

    在这里插入图片描述
    在这里插入图片描述
    横向分割函数为np.hsplit()。第二个参数为整数值时,将进行相等的分割。

    im_0, im_1 = np.hsplit(im, 2)
    
    print(im_0.shape)
    # (256, 128, 3)
    
    print(im_1.shape)
    # (256, 128, 3)
    

    第二个参数值为列表时,在那个值的位置处进行分割。

    im_0, im_1, im_2 = np.hsplit(im, [100, 150])
    
    print(im_0.shape)
    # (256, 100, 3)
    
    print(im_1.shape)
    # (256, 50, 3)
    
    print(im_2.shape)
    # (256, 106, 3)
    

    np.hsplit()和np.vsplit()指定第二个参数值时,不能进行等份分割时,便会发生错误。此时,用np.array_split()的话,会自动调节尺寸,进行分割。

    # im_0, im_1, im_2 = np.hsplit(im, 3)
    # ValueError: array split does not result in an equal division
    
    im_0, im_1, im_2 = np.array_split(im, 3, axis=1)
    
    print(im_0.shape)
    # (256, 86, 3)
    
    print(im_1.shape)
    # (256, 85, 3)
    
    print(im_2.shape)
    # (256, 85, 3)
    

    切片粘贴


    切片可以将一个矩阵中的矩形区域替换到另一个矩阵中去。
    比如:图片的一部分粘贴到全图片中。

    import numpy as np
    from PIL import Image
    
    src = np.array(Image.open('./data/01/lena_square.png').resize((128, 128)))
    dst = np.array(Image.open('./data/01/lena_square.png').resize((256, 256))) // 4
    
    dst_copy = dst.copy()
    dst_copy[64:128, 128:192] = src[32:96, 32:96]
    
    Image.fromarray(dst_copy).save('data/dst/lena_numpy_paste.jpg')
    

    在这里插入图片描述

    dst_copy = dst.copy()
    dst_copy[64:192, 64:192] = src
    
    Image.fromarray(dst_copy).save('./data/01/lena_numpy_paste_all.jpg')
    

    在这里插入图片描述
    Alpha混合和遮罩处理

    由于可以很容易的对矩阵中的每个元素进行操作,因此可以对2个图片进行混合和遮罩处理。
    在这里插入图片描述

    选择 上/下/左/右 反转


    矩阵的旋转,反转等函数的应用效果。
    在这里插入图片描述

    展开全文
  • 180526 将numpy矩阵保存图片

    千次阅读 2018-05-26 14:38:02
    Saving a Numpy array as an image # A 是一个numpy矩阵 from PIL import Image im = Image.fromarray(A) im.save("your_file.jpeg")

    Saving a Numpy array as an image
    这里写图片描述

    # A 是一个numpy矩阵
    from PIL import Image
    im = Image.fromarray(A)
    im.save("your_file.jpeg")

    这里写图片描述

    展开全文
  • 1.用scipy import scipy scipy.misc.imsave('test.jpg', img)   2.用PIL from PIL import Image im = Image.fromarray(img) im.save("test.jpg")

    1.用scipy

    import scipy

    scipy.misc.imsave('test.jpg', img)

     

    2.用PIL

    from PIL import Image

    im = Image.fromarray(img)

    im.save("test.jpg")

    展开全文
  • 实际是这样,可能解决方法,加个.astype(np.uint8) im=Image.fromarray(_img.astype(np.uint8), mode="RGB")
  • Numpy处理图片方法

    千次阅读 2020-01-18 08:26:20
    在进行图像领域的深度学习的时候经常需要对图片进行处理,包括图像的翻转,压缩,截取等,一般都是用Numpy来处理。处理起来也很方便。 In[3] # 导入需要的包 import numpy as np import matplotlib.pyplot as ...
  • 07_Numpy渐变图片的生成 ...01_Numpy图片处理(读取,变换,保存) 在此,对渐变图片的生死进行介绍: np.tile()和np.linspace() 渐变图片生成(代码) np.tile()和np.linspace() 虽然生成方法有很多...
  • 今天小编就为大家分享一篇python 实现将Numpy数组保存为图像,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 利用numpy存储图片数据

    千次阅读 2019-04-04 10:55:18
    NumPy提供了多种存取数组内容的文件操作函数。保存数组数据的文件可以是二进制格式或者文本格式。二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型。 一,tofile()和fromfile() tofile()将数组中的...
  • 用 opencv和numpy进行图片和字符串互转,并保存至 json 转至 https://zhuanlan.zhihu.com/p/27349847 受用 base64 进行图片和字符串互转,并保存至 json作者启发,试了试使用opencv来读取图片,然后用numpy转为list...
  • numpy保存数组,字典,非结构话数据 注意 保存字典数组是用save()函数保存 保存非结构化数据使用savez()函数保存 非结构化读取的数据,若调用具体元素需要在后边加[()]想去请看一下例子。 import numpy as np # ...
  • Numpy数组保存为图像

    万次阅读 2018-03-22 22:27:58
    有一个Numpy数组类型的矩阵,如何将它作为图像写入磁盘?任何格式的图像都行(PNG,JPEG,BMP ...)。最佳解决办法可以使用scipy.misc,代码如下:import scipy.misc scipy.misc.imsave('outfile.jpg', image_array) ...
  • 该代码是保存3通道RGB格式的图片所以要写convert(‘RGB’) 注意!!!这里还要对文件乘以255,即“image*255”,否则保存图片是黑色的!!!原因是:图像imgae从0变为1,PIL需要一个值介于0和255之间的图像。在...
  • NumPy

    千次阅读 多人点赞 2019-10-21 09:07:32
    文章目录NumPyNumPy数组对象NumPy数据类型NumPy数组运算NumPy索引和切片NumPy数组组合NumPy数组的属性NumPy数组的转换NumPy通用函数NumPy数据处理NumPy线性代数NumPy随机数NumPy例子 NumPy数组对象 NumPy中的...
  • python 将 Numpy 数组保存为图像 - imagio: import numpy as np import imageio if __name__ == '__main__': np_array = np.zeros((512, 512, 3), dtype=np.uint8) np_array[200:300, 150:200, :] = 255 ...
  • 1.用scipy import scipy scipy.misc.imsave('test.jpg', img) 没有misc module 'scipy.misc' has no attribute 'imsave' 艹 行不通! 2.用PIL from PIL import Image im = Image.fromarray(img...impor.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,342
精华内容 14,936
关键字:

numpy保存图片