尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

学习Python:使用Pillow处理图像

学习Python:使用Pillow处理图像 图像库PIL身为第三方包, 往解释器里增添了图像处理功能咧, 能允许对照片予以处理还能执行好多常见的图像文件操作。该软件目前版本是这样, 它属于原始PIL的一个分支, 有着相应支持。其他几个包, 像这般以及那般的, 借助其支持能够加载好多不同图像文件类型。它可以在以下几种情况当中被使用滴:1.图像处理2.图像存档3.批处理4.通过显示图像在本文中将学习如何使用执行以下操作1.打开图像2.裁剪图像3.使用过滤器4.添加边框5.调整图像大小使用pip命令安装-m pip打开图像可以打开并查看许多不同的文件类型。下面是一段示例代码from PIL import Imageimage Image.open(rC:\test\images\image01.jpg)image.show()首先, 代码要从PIL包之中导入Image, 接着要用Image.open()把图像打开, 如此这般便会返回一个PIL对象, 依靠该对象能知晓更多关于图像的信息。这具备极大便利性, 原因在于当下能够运用进行图像查看, 并不需去编写完整的图形用户界面, 还能借助其来知晓更多与你图像相关的信息, 请看下面这部分代码:from PIL import Imagedef get_image_info(path):image Image.open(path)print(f这个图像是{image.width} x {image.height})exif image._getexif()print(exif)if __name__ __main__:get_image_info(rC:\test\images\image01.jpg)在此处, 能够凭借image对象取得图像的宽度以及高度, 接着运用()方法获取关于图像的元数据。EXIF代表着“可交换图像文件格式”, 它是一种用以指定数码相机所使用的图像、声音和辅助标签格式类型的标准。输出极其详尽。然而, 设若运用照片编辑软件去裁剪, 运用此软件去应用过滤器, 或者运用该软件展开其他类别的图像处理, 那么Exif数据极有可能被更改, 这种更改极有可能刪除部分或者全部的Exif数据。试着在自身的一些照片上运行此项功能, 瞧瞧能够提取哪些信息。从图像里能够提取出来的另外一个饶有趣味的信息, 乃是它的直方图数据。图像的直方图, 是针对其色调值的一种图形化呈现方式。它会把照片的亮度显示成诸如那般能够绘制出图表的一系列值。欲从该图像里得到直方图嘞, 会运用图像的方式。随后, 借助把它给绘制出来。代码如下:import matplotlib.pyplot as pltfrom PIL import Imagedef get_image_histrogram(path):image Image.open(path)histogram image.histogram()plt.hist(histogram, binslen(histogram))plt.xlabel(Histogram)plt.show()if __name__ __main__:get_image_histrogram(rC:\test\images\image01.jpg)启动此代码之际, 就会如同往昔那般开启图像。接着从中抽取出直方图数据, 随后调用hist()函数把值列表传递给对象。hist()函数接纳值列表以及数值变动范围中的等宽度方条的数量。这套代码运行完毕后, 则会看到下方图1。图1此图显示了指定图像中的色调值。裁剪图像裁剪图像的示例代码如下from PIL import Imagedef crop_image(path, cropped_path):image Image.open(path)cropped image.crop((40, 590, 979, 1500))cropped.save(cropped_path)if __name__ __main__:crop_image(rC:\test\images\image02.jfif, rC:\test\images\image02_cropped.jfif)取得要裁剪的文件的路径, 以及新裁剪文件的路径的函数, 接着如往昔那般open()文件, 并调用crop(), 该方法采用用来裁剪的起始以及结束x/y坐标, 你正打造一个用于裁剪的长方体。用于进行裁剪操作的坐标, 因其伴随着照片而产生变动。实事求是来讲, 或许应当对这个代码作出更改, 让它能够接纳裁剪坐标, 从而把裁剪坐标当作参数来使用。其操作方式是你能够凭借自己进行反复不断的尝试, 以此探寻出所要运用的裁剪边界框。在这个过程当中, 你可以借助诸如Gimp这类工具来为你提供协助, 利用Gimp制作绘制出一个边界框, 并且记录下它所给予你的坐标数值, 以便于你往后进行尝试使用此项操作。使用过滤器能够应用于图像的存在着几个过滤器, 当前所支持的筛选器如下:1.BLUR2.3.4.5.6.7.8.9.10.使用前面的图像来测试这些过滤器。from PIL import Imagefrom PIL import ImageFilterdef blur(path, modified_photo):image Image.open(path)blurred_image image.filter(ImageFilter.BLUR)blurred_image.save(modified_photo)if __name__ __main__:blur(rC:\test\images\image01.jpg, rC:\test\images\image01_blurred.jpg)中若要实际去使用过滤器, 那是需要进行导入操作的。接着呢, 需要把将要去使用的特定筛选器传送给括号中的()方法。当对括号中的()进行调用的时候, 它就会返回出一个全新的图像对象。之后, 要把这个文件保存到磁盘那儿去。下面是另一个例子from PIL import Imagefrom PIL import ImageFilterdef sharpen(path, modified_photo):image Image.open(path)sharpened_image image.filter(ImageFilter.SHARPEN)sharpened_image.save(modified_photo)if __name__ __main__:sharpen(rC:\test\images\image01.jpg, rC:\test\images\image01_sharper.jpg)添加边框使得照片看上去更具专业感的一种办法是给照片予以添加边框, 借助模块达成这一点是极为容易的。from PIL import Image, ImageOpsdef add_border(input_image, output_image, border):img Image.open(input_image)if isinstance(border, int) or isinstance(border, tuple):bimg ImageOps.expand(img, borderborder)else:raise RuntimeError(边框不是整数或元组!)bimg.save(output_image)if __name__ __main__:in_img rC:\test\images\image01.jpgadd_border(in_img, output_imagerC:\test\images\image01_border.jpg, border100)函数, 它接受3个参数。这当中有一个, 是想去额外增附边框的图像。再有一个, 是已然将边框予以应用过后的图像。还有一个, 是边框实际应用所涉及到的呈像素单位的数值。是在这段代码里头, 你告知向传入的照片添加上一个有着100像素这样大小的边框。当传入一个整数之际, 该整数便会被用作所有四条边上的边框。边框的默认颜色是黑色。位于这里的关键方法是(), 它接收图像对象以及边界数量这二者。能够传入一组值, 借此让边框宽度产生差异。譬如, 要是传入的是(10, 50), 那么就会于图像的左侧以及右侧增添一个10像素的边框, 在顶部和底部添加一个50像素的边框。将fill参数传递给(), 能够更改边框颜色, 在这个过程里, 此参数采用的是命名颜色或RGB颜色。from PIL import Image, ImageOpsdef add_border(input_image, output_image, border, color0):img Image.open(input_image)if isinstance(border, int) or isinstance(border, tuple):bimg ImageOps.expand(img,borderborder,fillcolor)else:msg 边框不是整数或元组!raise RuntimeError(msg)bimg.save(output_image)if __name__ __main__:in_img rC:\test\images\image01.jpgadd_border(in_img,output_imagerC:\test\images\image01_border_red.jpg,border100,colorindianred)如今, (某个特定的)函数接纳一个color参数, 接着把该参数传送给(另一个特定的)方法。重新调整图像大小图像大小的调整运用起来是颇为简易的。运用()这样的方法, 此方法所接纳的乃是专门对应用以对图像大小做调整的整数组符()标点)之)的标点)整数组符)from PIL import Imagedef resize_image(input_image_path, output_image_path, size):original_image Image.open(input_image_path)width, height original_image.sizeprint(f原图像大小是{width} 宽 x {height} 高)resized_image original_image.resize(size)width, height resized_image.sizeprint(f调整后的图像大小是{width} 宽 x {height} 高)resized_image.show()resized_image.save(output_image_path)if __name__ __main__:resize_image(input_image_pathrC:\test\images\image03.jpg,output_image_pathrC:\test\images\image03_small.jpg,size(800, 400),)在对图片尺寸予以调整之际, 事实上并不会开展任何的缩放行径。与之相反, 将会对图像实施那样或这般的拉伸, 又或者是扭曲, 以此来契合咱们告知它所运用的数值。要缩放图像可以使用下面的代码from PIL import Imagedef scale_image(input_image_path,output_image_path,widthNone,heightNone):original_image Image.open(input_image_path)w, h original_image.sizeprint(f原图像大小是 {w} 宽 x {h} 高)if width and height:max_size (width, height)elif width:max_size (width, h)elif height:max_size (w, height)else:# 没有指定宽或高raise ValueError(宽或高是必需的!)original_image.thumbnail(max_size, Image.ANTIALIAS)original_image.save(output_image_path)scaled_image Image.open(output_image_path)width, height scaled_image.sizeprint(f调整大小后的图像是{width} 宽 x {height} 高)if __name__ __main__:scale_image(input_image_pathrC:\test\images\image03.jpg,output_image_pathrC:\test\images\image03_scaled.jpg,width800,)这次, 能够让用户去指定宽度以及高度。要是用户指定了宽度, 或者指定了高度, 又或者两者都进行了指定, 那么条件语句会利用该信息予以创建。一旦计算好了值, 就会把它传递给()并且保存结果。要是用户同时指定了这两个值, ()在开展调整大小时会正确维持纵横比。固然, 能够予以处理的要比于此处所介绍的更为繁多。比如说, 能够开展各类图像增强操作, 像是去更改图像的对比度或者亮度抑或是能够把多个图像合并成一幅。欢迎在下面留言完善本文内容让更多的人学到更完美的知识。诚挚欢迎来到知识星球, 也就是完美Excel社群, 在此可以展开技术方面的交流, 还能够提出问题。进而获取更多的电子资料, 并且借助社群加入专门特定的微信讨论群, 如此会更加便利, 更易于交流。
返回列表