📜  在Python中处理图像

📅  最后修改于: 2022-05-13 01:55:38.310000             🧑  作者: Mango

在Python中处理图像

PIL 是Python Imaging Library,它为Python解释器提供了图像编辑功能。它由 Fredrik Lundh 和其他几位贡献者开发。 Pillow 是由 Alex Clark 和其他贡献者开发的友好的 PIL 分支和易于使用的库。我们将与 Pillow 合作。

安装:

  • Linux:在 linux 终端上键入以下内容:
    pip install Pillow

    通过终端安装 pip:

    sudo apt-get update
    sudo apt-get install python-pip
  • Windows:根据你的Python版本下载合适的 Pillow 包。确保根据您拥有的Python版本下载。

我们将在这里使用 Image 模块,它提供了一个同名的类,并提供了许多处理我们的图像的函数。要导入 Image 模块,我们的代码应该以以下行开头:

from PIL import Image

图像操作:

  • 从路径打开特定图像:
    #img  = Image.open(path)     
    # On successful execution of this statement,
    # an object of Image type is returned and stored in img variable)
       
    try: 
        img  = Image.open(path) 
    except IOError:
        pass
    # Use the above statement within try block, as it can 
    # raise an IOError if file cannot be found, 
    # or image cannot be opened.
    
  • 检索图像的大小:创建的 Image 类的实例具有许多属性,其中一个有用的属性是大小。
    from PIL import Image
      
    filename = "image.png"
    with Image.open(filename) as image:
        width, height = image.size
    #Image.size gives a 2-tuple and the width, height can be obtained
    

    其他一些属性是:Image.width、Image.height、Image.format、Image.info 等。

  • 保存图像更改:要保存您对图像文件所做的任何更改,我们需要提供路径和图像格式。
    img.save(path, format)    
    # format is optional, if no format is specified, 
    #it is determined from the filename extension
    
  • 旋转图像:图像旋转需要角度作为参数来旋转图像。
    from PIL import Image
      
    def main():
        try:
            #Relative Path
            img = Image.open("picture.jpg") 
              
            #Angle given
            img = img.rotate(180) 
              
             #Saved in the same relative location
            img.save("rotated_picture.jpg")
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
    

    在python中旋转图像
    注意:有一个可选的扩展标志可用作旋转方法的参数之一,如果设置为 true,则扩展输出图像以使其足够大以容纳完整旋转的图像。
    如上面的代码片段所示,我使用了相对路径,其中我的图像与我的Python代码文件位于同一目录中,也可以使用绝对路径。

  • 裁剪图像: Image.crop(box) 采用 4 元组(左、上、右、下)像素坐标,并从使用的图像返回一个矩形区域。
    from PIL import Image
      
    def main():
        try:
            #Relative Path
            img = Image.open("picture.jpg")
            width, height = img.size
              
            area = (0, 0, width/2, height/2)
            img = img.crop(area)
              
            #Saved in the same relative location
            img.save("cropped_picture.jpg") 
              
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
    

    在python中裁剪图像

  • 调整图像大小: Image.resize(size)- 这里的大小以 2 元组宽度和高度的形式提供。
    from PIL import Image
      
    def main():
        try:
             #Relative Path
            img = Image.open("picture.jpg")
            width, height = img.size
       
            img = img.resize((width/2, height/2))
              
            #Saved in the same relative location
            img.save("resized_picture.jpg") 
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
    

    在python中调整图像大小

  • 将图像粘贴到另一个图像上:第二个参数可以是 2 元组(指定左上角)或 4 元组(左、上、右、下)——在这种情况下,粘贴图像的大小必须与此框区域的大小,或 None ,相当于 (0, 0)。
    from PIL import Image
      
    def main():
        try:
            #Relative Path
            #Image on which we want to paste
            img = Image.open("picture.jpg") 
              
            #Relative Path
            #Image which we want to paste
            img2 = Image.open("picture2.jpg") 
            img.paste(img2, (50, 50))
              
            #Saved in the same relative location
            img.save("pasted_picture.jpg")
              
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
      
    ##An additional argument for an optional image mask image is also available.
    

    在 Python 中将图像粘贴到其他图像上

  • 获取图像的直方图:这将返回图像的直方图作为像素计数列表,图像中的每个像素对应一个。 (图像的直方图是数字图像中色调分布的图形表示。它包含图像中包含的所有亮度值。它绘制每个亮度值的像素数。它有助于进行曝光设置.)
    从 PIL 导入图像
    def main():
        try:
            #Relative Path
            img = Image.open("picture.jpg") 
              
            #Getting histogram of image
            print img.histogram()
              
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
    

    在python中获取图像的直方图

  • 转置图像:此功能为我们提供图像的镜像
    from PIL import Image
      
    def main():
        try:
            #Relative Path
            img = Image.open("picture.jpg") 
              
            #transposing image 
            transposed_img = img.transpose(Image.FLIP_LEFT_RIGHT)
              
            #Save transposed image
            transposed_img.save("transposed.jpg")
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
    

    在python中转置图像

  • 将图像拆分为单独的波段:在 RGB 模式下拆分图像,创建三个新图像,每个图像都包含原始单独波段的副本。
    from PIL import Image
      
    def main():
        try:
            #Relative Path
            img = Image.open("picture.jpg") 
              
            #splitting the image
            print img.split()
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
    

    在python中分割图像

  • tobitmap:将图像转换为 X11 位图(纯文本二进制图像格式)。它返回一个包含 X11 位图的字符串,它只能用于模式“1”的图像,即 1 位像素的黑白图像。
    从 PIL 导入图像
    def main():
        try:
            #Relative Path
            img = Image.open("picture.jpg") 
            print img.mode
              
            #converting image to bitmap
            print img.tobitmap()
              
            print type(img.tobitmap())
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
    

    在python中将图像转换为位图
    在python中将图像转换为bitmao

  • 创建缩略图:此方法创建打开的图像的缩略图。它不会返回新的图像对象,而是对当前打开的图像对象本身进行就地修改。如果您不想更改原始图像对象,请创建一个副本,然后应用此方法。此方法还根据传递的大小评估适当的以保持图像的纵横比。
    从 PIL 导入图像
    def main():
        try:
            #Relative Path
            img = Image.open("picture.jpg") 
              
            #In-place modification
            img.thumbnail((200, 200)) 
              
            img.save("thumb.jpg")
        except IOError:
            pass
      
    if __name__ == "__main__":
        main()
    

    在python中创建图像的缩略图