crop函数Python python crop函数

python PIL如何才能把图片修改成正方形或者任意尺寸而不产生挤压改变图像尺寸有两类方法:
一是缩放(resize),即重采样 。这时,如果图像纵横比发生变化就会导致“挤压” 。
二是裁剪(crop) 。当然图只能越裁越?。徊还梢耘浜纤醴? ,先放大再裁剪 。
既然题主要求不能“挤压”,那就只能裁剪了 。函数名我给出来了,具体用法题主自己研究 。
Python如何图像识别?1. 简介 。
图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴 。PIL (Python Imaging Library)是 Python 中最常用的图像处理库 , 目前版本为 1.1.7 , 我们可以 在这里 下载学习和查找资料 。
Image 类是 PIL 库中一个非常重要的类 , 通过这个类来创建实例可以有直接载入图像文件 , 读取处理过的图像和通过抓取的方法得到的图像这三种方法 。
2. 使用 。
导入 Image 模块 。然后通过 Image 类中的 open 方法即可载入一个图像文件 。如果载入文件失败,则会引起一个 IOError ;若无返回错误,则 open 函数返回一个 Image 对象 。现在 , 我们可以通过一些对象属性来检查文件内容 , 即:
1import Image
2im = Image.open("j.jpg")
3print im.format, im.size, im.mode
4 JPEG (440, 330) RGB
这里有三个属性,我们逐一了解 。
format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值 。
size : 返回的一个元组,有两个元素 , 其值为象素意义上的宽和高 。
mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image) 。
现在 , 我们可以使用一些在 Image 类中定义的方法来操作已读取的图像实例 。比如,显示最新载入的图像:
1 im.show()
2
输出原图:
3. 函数概貌 。
3.1Reading and Writing Images : open( infilename ) , save( outfilename )
3.2Cutting and Pasting and Merging Images :
crop() : 从图像中提取出某个矩形大小的图像 。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角 。
paste() :
merge() :
1box = (100, 100, 200, 200)
2region = im.crop(box)
3region.show()
4region = region.transpose(Image.ROTATE_180)
5region.show()
6im.paste(region, box)
7im.show()
其效果图为:
旋转一幅图片:
1 def roll(image, delta):
2"Roll an image sideways"
3
4xsize, ysize = image.size
5
6delta = delta % xsize
7if delta == 0: return image
8
9part1 = image.crop((0, 0, delta, ysize))
10part2 = image.crop((delta, 0, xsize, ysize))
11image.paste(part2, (0, 0, xsize-delta, ysize))
12image.paste(part1, (xsize-delta, 0, xsize, ysize))
13
14return image
3.3几何变换 。
3.3.1简单的几何变换 。
1 out = im.resize((128, 128))#
2out = im.rotate(45)#逆时针旋转 45 度角 。
3out = im.transpose(Image.FLIP_LEFT_RIGHT)#左右对换 。
4out = im.transpose(Image.FLIP_TOP_BOTTOM)#上下对换 。
5out = im.transpose(Image.ROTATE_90)#旋转 90 度角 。
6out = im.transpose(Image.ROTATE_180)#旋转 180 度角 。
7 out = im.transpose(Image.ROTATE_270)#旋转 270 度角 。
各个调整之后的图像为:
图片1:
图片2:
图片3:
图片4:
3.3.2色彩空间变换 。
convert() : 该函数可以用来将图像转换为不同色彩模式 。
3.3.3图像增强 。
Filters : 在 ImageFilter 模块中可以使用 filter 函数来使用模块中一系列预定义的增强滤镜 。
1import ImageFilter
2imfilter = im.filter(ImageFilter.DETAIL)
3imfilter.show()
3.4序列图像 。
即我们常见到的动态图,最常见的后缀为 .gif,另外还有 FLI / FLC。PIL 库对这种动画格式图也提供了一些基本的支持 。当我们打开这类图像文件时,PIL 自动载入图像的第一帧 。我们可以使用 seek 和 tell 方法在各帧之间移动 。
1 import Image
2 im.seek(1)# skip to the second frame
3
4 try:
5while 1:
6im.seek( im.tell()1)
7# do something to im
8 except EOFError:
9pass
3.5更多关于图像文件的读取 。
最基本的方式:im = Image.open("filename")
类文件读?。篺p = open("filename", "rb"); im = Image.open(fp)
字符串数据读?。篿mport StringIO; im = Image.open(StringIO.StringIO(buffer))
从归档文件读?。篿mport TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)
基本的 PIL 目前就练习到这里 。其他函数的功能可点击 这里 进一步阅读 。
有没有人用过Python的Image模块 关于crop方法的问题box = (100, 100, 400, 400)
region = im.crop(box)
区域由一个4元组定义crop函数Python,表示为坐标是 (left, upper, right, lower) 。Python Imaging Library 使用左上角为 (0, 0)crop函数Python的坐标系统 。同时要注意crop函数Python,这些坐标指向像素之间的位置,因此上述例子中描述的区域的大小为300x300像素 。
后两个数字需要比前两个大
python:PIL图像处理PIL (Python Imaging Library)
Python图像处理库,该库支持多种文件格式,提供强大的图像处理功能 。
PIL中最重要的类是Image类,该类在Image模块中定义 。
从文件加载图像:
如果成功,这个函数返回一个Image对象 。现在你可以使用该对象的属性来探索文件的内容 。
format 属性指定了图像文件的格式,如果图像不是从文件中加载的则为 None。
size 属性是一个2个元素的元组,包含图像宽度和高度(像素) 。
mode 属性定义了像素格式,常用的像素格式为:“L” (luminance) - 灰度图, “RGB” , “CMYK” 。
如果文件打开失败, 将抛出IOError异常 。
一旦你拥有一个Image类的实例,你就可以用该类定义的方法操作图像 。比如:显示
( show() 的标准实现不是很有效率,因为它将图像保存到一个临时文件 , 然后调用外部工具(比如系统的默认图片查看软件)显示图像 。该函数将是一个非常方便的调试和测试工具 。)
接下来的部分展示了该库提供的不同功能 。
PIL支持多种图像格式 。从磁盘中读取文件,只需使用 Image 模块中的 open 函数 。不需要提供文件的图像格式 。PIL库将根据文件内容自动检测 。
如果要保存到文件,使用 Image 模块中的 save 函数 。当保存文件时,文件名很重要,除非指定格式,否则PIL库将根据文件的扩展名来决定使用哪种格式保存 。
** 转换文件到JPEG **
save 函数的第二个参数可以指定使用的文件格式 。如果文件名中使用了一个非标准的扩展名,则必须通过第二个参数来指定文件格式 。
** 创建JPEG缩略图 **
需要注意的是,PIL只有在需要的时候才加载像素数据 。当你打开一个文件时 , PIL只是读取文件头获得文件格式、图像模式、图像大小等属性,而像素数据只有在需要的时候才会加载 。
这意味着打开一个图像文件是一个非常快的操作,不会受文件大小和压缩算法类型的影响 。
** 获得图像信息 **
Image 类提供了某些方法,可以操作图像的子区域 。提取图像的某个子区域,使用 crop() 函数 。
** 复制图像的子区域 **
定义区域使用一个包含4个元素的元组 , (left, upper, right, lower) 。坐标原点位于左上角 。上面的例子提取的子区域包含300x300个像素 。
该区域可以做接下来的处理然后再粘贴回去 。
** 处理子区域然后粘贴回去 **
当往回粘贴时,区域的大小必须和参数匹配 。另外区域不能超出图像的边界 。然而原图像和区域的颜色模式无需匹配 。区域会自动转换 。
** 滚动图像 **
paste() 函数有个可选参数,接受一个掩码图像 。掩码中255表示指定位置为不透明 , 0表示粘贴的图像完全透明,中间的值表示不同级别的透明度 。
PIL允许分别操作多通道图像的每个通道,比如RGB图像 。split() 函数创建一个图像集合,每个图像包含一个通道 。merge() 函数接受一个颜色模式和一个图像元组,然后将它们合并为一个新的图像 。接下来的例子交换了一个RGB图像的三个通道 。
** 分离和合并图像通道 **
对于单通道图像 , split() 函数返回图像本身 。如果想处理各个颜色通道,你可能需要先将图像转为RGB模式 。
resize() 函数接受一个元组,指定图像的新大小 。
rotate() 函数接受一个角度值 , 逆时针旋转 。
** 基本几何变换 **
图像旋转90度也可以使用 transpose() 函数 。transpose() 函数也可以水平或垂直翻转图像 。
** transpose **
transpose() 和 rotate() 函数在性能和结果上没有区别 。
更通用的图像变换函数为 transform()。
PIL可以转换图像的像素模式 。
** 转换颜色模式 **
PIL库支持从其他模式转为“L”或“RGB”模式,其他模式之间转换 , 则需要使用一个中间图像 , 通常是“RGB”图像 。
ImageFilter 模块包含多个预定义的图像增强过滤器用于 filter() 函数 。
** 应用过滤器 **
point() 函数用于操作图像的像素值 。该函数通常需要传入一个函数对象,用于操作图像的每个像素:
** 应用点操作 **
使用以上技术可以快速地对图像像素应用任何简单的表达式 。可以结合 point() 函数和 paste 函数修改图像 。
** 处理图像的各个通道 **
注意用于创建掩码图像的语法:
Python计算逻辑表达式采用短路方式,即:如果and运算符左侧为false,就不再计算and右侧的表达式,而且返回结果是表达式的结果 。比如 a and b 如果a为false则返回a , 如果a为true则返回b,详见Python语法 。
对于更多高级的图像增强功能,可以使用 ImageEnhance 模块中的类 。
可以调整图像对比度、亮度、色彩平衡、锐度等 。
** 增强图像 **
PIL库包含对图像序列(动画格式)的基本支持 。支持的序列格式包括 FLI/FLC 、 GIF 和一些实验性的格式 。TIFF 文件也可以包含多个帧 。
当打开一个序列文件时 , PIL库自动加载第一帧 。你可以使用 seek() 函数 tell() 函数在不同帧之间移动 。
** 读取序列 **
如例子中展示的 , 当序列到达结尾时 , 将抛出EOFError异常 。
注意当前版本的库中多数底层驱动只允许seek到下一帧 。如果想回到前面的帧 , 只能重新打开图像 。
以下迭代器类允许在for语句中循环遍历序列:
** 一个序列迭代器类 **
PIL库包含一些函数用于将图像、文本打印到Postscript打印机 。以下是一个简单的例子 。
** 打印到Postscript **
如前所述,可以使用 open() 函数打开图像文件,通常传入一个文件名作为参数:
如果打开成功 , 返回一个Image对象,否则抛出IOError异常 。
也可以使用一个file-like object代替文件名(暂可以理解为文件句柄) 。该对象必须实现read , seek,tell函数 , 必须以二进制模式打开 。
** 从文件句柄打开图像 **
如果从字符串数据中读取图像,使用StringIO类:
** 从字符串中读取 **
如果图像文件内嵌在一个大文件里 , 比如 tar 文件中 。可以使用ContainerIO或TarIO模块来访问 。
** 从tar文档中读取 **
** 该小节不太理解,请参考原文 **
有些解码器允许当读取文件时操作图像 。通常用于在创建缩略图时加速解码(当速度比质量重要时)和输出一个灰度图到激光打印机时 。
draft() 函数 。
** Reading in draft mode **
输出类似以下内容:
注意结果图像可能不会和请求的模式和大小匹配 。如果要确保图像不大于指定的大小,请使用 thumbnail 函数 。
Python2.7 教程 PIL
Python 之 使用 PIL 库做图像处理
来自
??【Python从入门到精通】(二十七)更进一步的了解Pillow吧! 本文是接上一篇 ??【Python从入门到精通】(二十六)用Python的PIL库(Pillow)处理图像真的得心应手??进一步介绍Pillow库的使用,本文将重点介绍一些高级特性:比如如何利用Pillow画图形(圆形,正方形),介绍通过Pillow库给图片添加水?。煌倍陨弦黄恼挛唇樯艿某S弥兜憬胁钩渌得?。希望对读者朋友们有所帮助 。
上一篇文章已经介绍了Image模块,但是介绍的还不够全面,例如如何从网页中读取图片没有介绍到,如何裁剪图片都没有介绍到 。
读取网页中的图片的基本实现方式是:首先利用requests库读取当前图片链接的内容,接着将内容转成二进制数据,在通过open方法将该二进制数据,最后通过save方法进行保存 。
读取结果是:
通过crop方法可以从图片中裁剪出一个指定大小的区域 。裁取的区域范围是 (left, upper, right, lower)比如从某个宽高都是400的图片中裁剪一个是宽高都是100的正方形区域,只需要指定裁剪区域的坐标是:(0, 0, 100, 100)
有裁剪还有一个方法就是重新设置图片大小的方法 resize,比如将前面400 400的图片 修改成 300 200,只需要调用resize方法
通过 convert方法进行图片模式的转换
前面介绍的ImageDraw库,只是介绍了利用它来向图片写入文本 , 其实ImageDraw模块还有一个更有用的途径,就是可以通过它来画各种图形 。
首先创建一个600*600的画布 。然后再画布中画出一个正方形,画直线的方法是 line方法 。
ImageDraw.line(xy, fill=None, width=0, joint=None)
在xy的坐标之间画一条直线
xy-- 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
fill-- 直线的颜色
width-- 直线的宽度
画一个边框宽度为2px,颜色为蓝色的,面积为400*400的正方形 。
ImageDraw.arc(xy, start, end, fill=None, width=0)
在给定的区域范围内,从开始角到结束角之间绘制一条圆弧
xy--定义边界框的两个点,传入的格式是[ (x0, y0), (x1, y1)]或者[x0, y0, x1, y1],其中 x1=x0,y1=y0
start -- 起始角度,以度为单位,从3点钟开始顺时针增加
end-- 结束角度,以度为单位
fill-- 弧线的颜色
width--弧线的宽度
这里就是画了一个半圆,如果结束角度是360度的话则就会画一个完整的圆 。
画圆通过ImageDraw.ellipse(xy, fill=None, outline=None, width=1) 方法,该方法可以画出一个给定范围的圆
xy-- 定义边界框的两个点,传入的格式是[ (x0, y0), (x1, y1)]或者[x0, y0, x1, y1],其中 x1=x0,y1=y0
outline-- 轮廓的颜色
fill --- 填充颜色
width-- 轮廓的宽度
ImageDraw.chord(xy, start, end, fill=None, outline=None, width=1) 方法用来画半圆,跟arc()方法不同的是它会用直线将起始点和结束点连接起来
xy-- 定义边界框的两个点,传入的格式是[ (x0, y0), (x1, y1)]或者[x0, y0, x1, y1] , 其中 x1=x0,y1=y0
outline-- 轮廓的颜色
fill --- 填充颜色
width-- 轮廓的宽度
ImageDraw.pieslice(xy, start, end, fill=None, outline=None, width=1)
类似于arc()方法,不过他会在端点和圆点之间画直线
xy--定义边界框的两个点,传入的格式是[ (x0, y0), (x1, y1)]或者[x0, y0, x1, y1],其中 x1=x0,y1=y0
start -- 起始角度,以度为单位,从3点钟开始顺时针增加
end-- 结束角度,以度为单位
fill-- 弧线的颜色
width--弧线的宽度
ImageDraw.rectangle(xy, fill=None, outline=None, width=1)
xy-- 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
outline-- 轮廓的颜色
fill-- 填充的颜色
width-- 轮廓线的宽度
ImageDraw.rounded_rectangle(xy, radius=0, fill=None, outline=None, width=1)该方法可以画一个圆角矩形
xy-- 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
radius-- 角的半径
outline-- 轮廓的颜色
【crop函数Python python crop函数】fill-- 填充的颜色
width-- 轮廓线的宽度
这里有个问题,就是画好的图形如何从Image中扣出来呢?
ImageEnhance模块主要是用于设置图片的颜色对比度亮度锐度等啥的 , 增强图像 。
原始图像
ImageFilter模块主要用于对图像进行过滤,增强边缘,模糊处理,该模块的使用方式是 im.filter(ImageFilter)。
其中ImageFilter按照需求传入指定的过滤值 。
下面一个个试下效果
4.边缘增强
ImageGrab模块主要用于对屏幕进行截图,通过grab方法进行截?。?如果不传入任何参数则表示全屏幕截图,否则是截取指定区域的图像 。其中box格式是:(x1,x2,y1,y2)
利用Pillow库可以轻易的对图像增加水印
首先,用PIL的Image函数读取图片
接着 , 新建一张图(尺寸和原图一样)
然后,在新建的图象上用PIL的ImageDraw把字给画上去,字的颜色从原图处获取 。
原图
添加文字后的效果图
本文详细介绍了Pillow库的使用 , 希望对读者朋友们有所帮助 。
Pillow官方文档
需要获取源码的小伙伴可以关注下方的公众号,回复【python】
crop函数Python的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于python crop函数、crop函数Python的信息别忘了在本站进行查找喔 。

    推荐阅读