在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()
注意:有一个可选的扩展标志可用作旋转方法的参数之一,如果设置为 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()
- 调整图像大小: 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()
- 将图像粘贴到另一个图像上:第二个参数可以是 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.
- 获取图像的直方图:这将返回图像的直方图作为像素计数列表,图像中的每个像素对应一个。 (图像的直方图是数字图像中色调分布的图形表示。它包含图像中包含的所有亮度值。它绘制每个亮度值的像素数。它有助于进行曝光设置.)
从 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()
- 转置图像:此功能为我们提供图像的镜像
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()
- 将图像拆分为单独的波段:在 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()
- 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()
- 创建缩略图:此方法创建打开的图像的缩略图。它不会返回新的图像对象,而是对当前打开的图像对象本身进行就地修改。如果您不想更改原始图像对象,请创建一个副本,然后应用此方法。此方法还根据传递的大小评估适当的以保持图像的纵横比。
从 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()