zoukankan      html  css  js  c++  java
  • PIL笔记

    图片颜色的类型

    1 (1-bit pixels, black and white, stored with one pixel per byte)
    L (8-bit pixels, black and white)
    P (8-bit pixels, mapped to any other mode using a color palette)
    RGB (3x8-bit pixels, true color)
    RGBA (4x8-bit pixels, true color with transparency mask)
    CMYK (4x8-bit pixels, color separation)
    YCbCr (3x8-bit pixels, color video format)
    I (32-bit signed integer pixels)
    F (32-bit floating point pixels)

    从数组产生图片

    从数组产生彩色图片

    numpy天然就是处理图像数据的好工具,skimage库大量的使用numpy,实现了部分opencv的功能,非常值得研究。

    from PIL import Image
    import numpy as np
    
    data = -np.ones((100, 3)).reshape(10, 10, 3).astype('byte')
    data[:5, :5, 2] = 0  # 只保留RG两色,即为黄色
    data[5:, 5:, 1] = 0
    data[:5, 5:, 0] = 0
    img = Image.fromarray(data, "RGB")
    img.show()
    

    从数组产生灰度图片

    from PIL import Image
    import numpy as np
    """
    当使用fromarray产生图片时,图片的类型(1,L,P之类的)跟数组每个元素的大小必须匹配!
    """
    img = Image.fromarray(np.array([255]*100).astype(np.byte).reshape(10,10), 'L')
    print(list(img.getdata()))
    img.show()
    

    PIL中的柱状图

    from PIL import  Image
    img=Image.open("haha.jpg")
    res=img.histogram()
    print(len(res))
    

    使用调色板

    from PIL import Image
    import numpy as np
    
    """
    如果mode=1,不管数组的实际长度,总是取其中的前width*height位,mode=1是黑白图
    mode=L是灰度图
    mode=P是调色板图,可以容纳256种颜色,它可以是彩图
    """
    # 首先创建一个灰度图,其中每个像素都是122灰度
    img = Image.fromarray((122 * np.ones((20, 20))).astype(np.byte), "P")
    
    
    def method1():
        # 创建一个pallete,注意pallete只能用于mode=L和mode=P的情况,用于将灰度图彩色化
        pallete = np.zeros(256 * 3).astype(np.byte)  # 与pallete数组的形状无关,只取前768个byte
        # 将灰度为122的元素置为红色
        pallete[122 * 3] = 255
        img.putpalette(pallete)
    
    
    def method2():
        # 创建一个pallete,注意pallete只能用于mode=L和mode=P的情况,用于将灰度图彩色化
        pallete = np.zeros(256 * 3).astype(np.byte)  # 与pallete数组的形状无关,只取前768个byte
        # 将灰度为122的元素置为红色
        pallete[122 * 3] = 255
        img.putpalette(pallete)
    
    
    def method3():
        pallete = [0] * 768
        pallete[122 * 3] = 255
        img.putpalette(pallete)
    
    
    method2()
    img.show()
    # 灰度122映射为RGB应为(122,122,122),RGB三色相同必然是灰色
    

    使用图片的info

    """
    能否保留文件info信息取决于图片类型
    """
    img = Image.fromarray((128 * np.ones((20, 20))).astype(np.byte), "L")
    img.info['user'] = "weidiao"
    print(img.info)
    img.save("haha.pdf")
    img = Image.open("haha.pdf")
    print(img.info)
    

    不论何时,总是想着全部掌握一个库都是一种愚蠢的思想。一方面是没有必要,另一方面是不太可能。
    不论何时,浏览一下库的全部内容都是一种智慧,一遍记不住浏览两遍,浏览的次数多了,不仅有助于知道库的功能,还有助于了解一些好的设计。

  • 相关阅读:
    android开发之gridlayout使用入门
    android开发之merge结合include优化布局
    android开发布局优化之ViewStub
    FindBug:Call to static DateFormat
    SimpleDateFormat的使用问题
    某P2P开发商ERP系统核心业务介绍
    某P2P开发商ERP系统核心业务介绍
    xtu字符串 C. Marlon's String
    学渣乱搞系列之扩展KMP的那点事
    xtu字符串 D. 病毒侵袭
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/8051334.html
Copyright © 2011-2022 走看看