本文目录一览:
1.图像裁剪、加边框、旋转(Python PIL)
日常工作中经常要用Photoshop打印一些地质图,虽然说PS有动作录制的功能,但是打印这个功能我尝试过录制动作后并未能成功运行,而且要打印的图像尺寸很多都是不同的,试了几次后就放弃了,直到后来Python学起来了,通过pywinauto库实现了这个功能,在这里就简单记录下吧。
在写Photoshop的打印操作之前,先来回顾下打印之前的图像处理工作。
接到的地质图多为MapGIS程序导出的jpg图片,偶尔也会有Tif格式的遥感图。对这些图像进行打印很简单,基本流程是:用PS打开图像-裁剪图像四周空白边缘-为图像四周加上3cm宽白色边框(为了美观和装订的需要)-打印。那为啥用PS来打印不直接用Windows自带打印呢,应该是打印需要用到PS特定的颜色处理模式吧,经过试验,通过两种方式打出来的色彩效果确实是不同的。
打印前图像处理的主要目标很简单:
1、裁剪图像四周空白
2、为图像四周加上3cm白色边框
下面就用Python实现它们
图像处理主要用的是PIL这个库,中途由于单位电脑比较旧(4g内存Win7 32位系统,后来重装成64位了,体验就是搞这种东西必须整个64位系统),性能不太行了,也用Opencv整了下,还是感觉PIL稍微快那么一点点,不知道是不是错觉呢。
(后来发现这两步在PS录个动作也能轻松完成(→ܫ←))
一、获取所有图片路径
有时候要打印的图片会放在好多个不同文件夹里面,要把它们遍历出来:
import os
二、读取图片并裁剪四周空白
import PIL
获得了图像尺寸后接下来就要对图像进行边缘空白的裁剪了(其实这两步不分先后顺序的):
裁剪的思路是网上搜到的,整理下就是:
1、先把图像转成灰度模式(值变成单一的0-255以方便判断,如果要裁剪其他颜色我就不知道了,我这里只要裁掉最常见的由MapGIS导出的标准的白色边缘)。
2、分别从四个方向扫描图像,找到四个方向各自第一个灰度值不为255(最纯粹的白色(→ܫ←))的像素,记下它的坐标(i,j)。
3、通过四组坐标大小比较,得到图像除了四周空白区域外的坐标极值,也就得到了裁剪的区域左上(left,top)和右下坐标(right,bottom)。
4、利用PIL.Image.crop(),完成图像的裁剪。
5、没了,就是后来发现PIL自带这个算法,引用一下: 使用PIL裁剪图片白边
要是用PS来做呢,‘图像-裁切-确定’就完事了。
三、给裁剪后的图像加上x厘米的白色边框
这一步主要是为了打印出来的图规范且美观。
这一步要是用PS来搞,‘图像-画布大小-设置相对的宽度和高度’ 就好了
四、判断图像是否需要旋转。
为什么要旋转这些图像呢?因为最终是要把它们用打印机打印出来,而打印机能打印的最大宽度是有限的,所以就有了这个步骤。
单位的打印机型号是惠普的HP DesignJet Z6200 60 英寸照片打印机,最大打印纸张宽度是60英寸,大约就是1524mm左右吧,除了最大尺寸外,日常还用到的纸张宽度有440、610、914、1067、1274等6、7种吧,所以出于节约打印时间和省钱的考虑,为每张图选择最合适的打印纸张宽度也是很有必要的。
判断图像是否需要旋转的思路是这样的:
1、比较图像的宽和高,判断谁是图像的长边和短边。
2、短边如果大于1524mm,这图按1:1就打不出来了,超过打印机最大可装入的纸张的宽度,把这个图像文件放到Oversize_path路径下,后续自己看着办。
3、在短边小于等于1524mm的前提下,根据对图像宽高和长短边的比较,有两种需要旋转的情况:
3.1 如果图像的宽是长边(矮胖的矩形),且宽大于1524mm,那么这图得旋转90°;
3.2 如果图像的高是长边(瘦高的矩形),且高小于1524mm,那么这图也得旋转90°。
*printTOtkinter()是个用tkinter搞的进度显示窗口,就输出下一些文本信息而已。
五、为图像选择最合适的打印纸张尺寸
单位打印纸有438、610、914、1524等7种宽度,现在要选出最适合的一种来进行打印。
在把短边大于1524这种情况排除之后,剩下的图像情况为短边小于1524,即单位的打印机能打印出来了。
这时要判断最佳打印用纸的宽度,有两种情况需要考虑:
1、长边>1524,改用短边来比较选择打印纸宽度。
2、长边 ≤ 1524,用长边来比较选择打印纸宽度。
下面思路就是把要用作比较的边长放入纸张宽度列表,把列表排序后找到比这个边长大一点的那个纸张宽度。
主要的步骤就是这些,再经过一顿复制粘贴完善一下其他细节之后,最后会得到一个存放打印信息的列表,把它用txt存起来,这样后面的PS批量打印需要的信息就全部搞到手了。最后放个gif。
OpenCV Python 系列教程4 - OpenCV 图像处理(上)
学习目标:
OpenCV 中有 150 多种色彩空间转化的方法,这里只讨论两种:
HSV的色相范围为[0,179],饱和度范围为[0,255],值范围为[0,255]。不同的软件使用不同的规模。如果要比较 OpenCV 值和它们,你需要标准化这些范围。
HSV 和 HLV 解释
运行结果:该段程序的作用是检测蓝色目标,同理可以检测其他颜色的目标
结果中存在一定的噪音,之后的章节将会去掉它
这是物体跟踪中最简单的方法。一旦你学会了等高线的函数,你可以做很多事情,比如找到这个物体的质心,用它来跟踪这个物体,仅仅通过在相机前移动你的手来画图表,还有很多其他有趣的事情。
菜鸟教程 在线 HSV- BGR 转换
比如要找出绿色的 HSV 值,可以使用上面的程序,得到的值取一个上下界。如上面的取下界 [H-10, 100, 100],上界 [H+10, 255, 255]
或者使用其他工具如 GIMP
学习目标:
对图像进行阈值处理,算是一种最简单的图像分割方法,基于图像与背景之间的灰度差异,此项分割是基于像素级的分割
threshold(src, thresh, maxval, type[, dst]) - retval, dst
计算图像小区域的阈值。所以我们对同一幅图像的不同区域得到不同的阈值,这给我们在不同光照下的图像提供了更好的结果。
三个特殊的输入参数和一个输出参数
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) - dst
opencv-threshold-python
OpenCV 图片集
本节原文
学习目标:
OpenCV 提供两种变换函数: cv2.warpAffine 和 cv2.warpPerspective
cv2.resize() 完成缩放
文档说明
运行结果
说明 : cv2.INTER_LINEAR 方法比 cv2.INTER_CUBIC 还慢,好像与官方文档说的不一致? 有待验证。
速度比较: INTER_CUBIC INTER_NEAREST INTER_LINEAR INTER_AREA INTER_LANCZOS4
改变图像的位置,创建一个 np.float32 类型的变换矩阵,
warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) - dst
运行结果:
旋转角度( )是通过一个变换矩阵变换的:
OpenCV 提供的是可调旋转中心的缩放旋转,这样你可以在任何你喜欢的位置旋转。修正后的变换矩阵为
这里
OpenCV 提供了 cv2.getRotationMatrix2D 控制
cv2.getRotationMatrix2D(center, angle, scale) → retval
运行结果
cv2.getAffineTransform(src, dst) → retval
函数关系:
\begin{bmatrix} x'_i \ y'_i \end{bmatrix}\begin{bmatrix} x'_i \ y'_i \end{bmatrix} =
其中
运行结果:图上的点便于观察,两图中的红点是相互对应的
透视变换需要一个 3x3 变换矩阵。转换之后直线仍然保持笔直,要找到这个变换矩阵,需要输入图像上的 4 个点和输出图像上的对应点。在这 4 个点中,有 3 个不应该共线。通过 cv2.getPerspectiveTransform 计算得到变换矩阵,得到的矩阵 cv2.warpPerspective 变换得到最终结果。
本节原文
平滑处理(smoothing)也称模糊处理(bluring),是一种简单且使用频率很高的图像处理方法。平滑处理的用途:常见是用来 减少图像上的噪点或失真 。在涉及到降低图像分辨率时,平滑处理是很好用的方法。
图像滤波:尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
消除图像中的噪声成分叫做图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段,在高频段,有用的信息会被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
滤波的目的:抽出对象的特征作为图像识别的特征模式;为适应图像处理的要求,消除图像数字化时混入的噪声。
滤波处理的要求:不能损坏图像的轮廓及边缘等重要信息;图像清晰视觉效果好。
平滑滤波是低频增强的空间滤波技术,目的:模糊和消除噪音。
空间域的平滑滤波一般采用简单平均法,即求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑效果越好,但是邻域过大,平滑也会使边缘信息的损失的越大,从而使输出图像变得模糊。因此需要选择合适的邻域。
滤波器:一个包含加权系数的窗口,利用滤波器平滑处理图像时,把这个窗口放在图像上,透过这个窗口来看我们得到的图像。
线性滤波器:用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。
低通滤波器、高通滤波器、带通滤波器、带阻滤波器、全通滤波器、陷波滤波器
boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) - dst
均值滤波是方框滤波归一化后的特殊情况。归一化就是要把处理的量缩放到一个范围内如 (0,1),以便统一处理和直观量化。非归一化的方框滤波用于计算每个像素邻近内的积分特性,比如密集光流算法中用到的图像倒数的协方差矩阵。
运行结果:
均值滤波是典型的线性滤波算法,主要方法为邻域平均法,即用一片图像区域的各个像素的均值来代替原图像中的各个像素值。一般需要在图像上对目标像素给出一个模板(内核),该模板包括了其周围的临近像素(比如以目标像素为中心的周围8(3x3-1)个像素,构成一个滤波模板,即 去掉目标像素本身 )。再用模板中的全体像素的平均值来代替原来像素值。即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m ∑f(x,y) ,其中m为该模板中包含当前像素在内的像素总个数。
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) → dst
结果:
高斯滤波:线性滤波,可以消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过 加权平均 后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
高斯滤波有用但是效率不高。
高斯模糊技术生成的图像,其视觉效果就像是经过一个半透明屏幕在观察图像,这与镜头焦外成像效果散景以及普通照明阴影中的效果都明显不同。高斯平滑也用于计算机视觉算法中的预先处理阶段,以增强图像在不同比例大小下的图像效果(参见尺度空间表示以及尺度空间实现)。从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。 高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。
一维零均值高斯函数为: 高斯分布参数 决定了高斯函数的宽度。
高斯噪声的产生
GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) - dst
线性滤波容易构造,并且易于从频率响应的角度来进行分析。
许多情况,使用近邻像素的非线性滤波会得到更好的结果。比如在噪声是散粒噪声而不是高斯噪声,即图像偶尔会出现很大值的时候,用高斯滤波器进行图像模糊时,噪声像素不会被消除,而是转化为更为柔和但仍然可见的散粒。
中值滤波(Median filter)是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声『椒盐噪声又称脉冲噪声,它随机改变一些像素值,是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割引起。』的同时又能保留图像边缘细节,
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点,对于 斑点噪声(speckle noise)和椒盐噪声(salt-and-pepper noise) 来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值。中值滤波器在处理连续图像窗函数时与线性滤波器的工作方式类似,但滤波过程却不再是加权运算。
中值滤波在一定的条件下可以克服常见线性滤波器如最小均方滤波、方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。
与均值滤波比较:
说明:中值滤波在一定条件下,可以克服线性滤波器(如均值滤波等)所带来的图像细节模糊,而且对滤除脉冲干扰即图像扫描噪声最为有效。在实际运算过程中并不需要图像的统计特性,也给计算带来不少方便。 但是对一些细节多,特别是线、尖顶等细节多的图像不宜采用中值滤波。
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合 图像的空间邻近度和像素值相似度 的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差 sigma-d ,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。 但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。
运行结果
学习目标:
形态变换是基于图像形状的一些简单操作。它通常在二进制图像上执行。
膨胀与腐蚀实现的功能
侵蚀的基本思想就像土壤侵蚀一样,它会侵蚀前景物体的边界(总是试图保持前景为白色)。那它是做什么的?内核在图像中滑动(如在2D卷积中)。只有当内核下的所有像素都是 1 时,原始图像中的像素( 1 或 0 )才会被视为 1 ,否则它将被侵蚀(变为零)
erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) - dst
与腐蚀的操作相反。如果内核下的至少一个像素为“1”,则像素元素为“1”。因此它增加了图像中的白色区域或前景对象的大小增加。通常,在去除噪音的情况下,侵蚀之后是扩张。因为,侵蚀会消除白噪声,但它也会缩小我们的物体。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的物体区域会增加。它也可用于连接对象的破碎部分
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 库做图像处理
来自
pillow教程
在Python图像库中最重要的类是同名模块中定义的 Image 类。您可以利用以下方法创造该类的实例:从文件中导入图像、处理其他的图像以及从零开始创建图像。
从文件中导入图像,使用在 Image 模块中的 open() 函数:
如果成功。该函数返回一个 Image 对象。您现在可以使用实例的属性来检查文件内容了:
format 属性识别图像的来源。如果图像不是从图像中读取,则该属性设置为None。 size 属性是一个一个包含宽和高(像素)的二元组。 mode 属性定义图像频段的数量和名称,以及像素的类型和深度。常用的模式(mode)为表示灰色图像的“L”,表示真彩色图像的处理问题“RGB”,以及印前图像的画面“CMYK”。
如何图像不能被打开,则会报出 OSError 异常。
一旦您有 Image 类的实例,您可以使用类中定义的方法来处理和操作图像。比如,让我们显示导入的图像:
show() 的标准版本不是非常的高效,因为该函数会把图像保存到一个临时文件并调用实用程序来显示图像。如果您没有安装一个合适的实用程序,它甚至不会起作用。虽然当它不起作用时,调试和测试是非常方便的。
下面的章节概括了该库提供的不同函数。
该Python图像库支持大量的图像文件格式。为了从磁盘中阅读文件,使用在 Image 模块中的 open() 。您不需要知道打开文件的文件格式。该库能够自动地根据文件的内容决定格式。
为了保存一个文件,使用 Image 类中的 save() 方法。当保存文件时,名字非常重要。除非您指定格式,该库使用文件名的后缀来发现将要使用的文件存储格式。
提供给 save() 方法的第二个参数精准地制定了一个文件的格式。如果您使用了非标准的后缀,您必须一直使用以下方式指定格式:
值得注意的是,非必要情况该库不会解码或加载栅格数据(raster data)。当您打开一个文件时,文件头将被读取用于确定文件格式以及提取如模式、尺寸等其他解码文件需要的性质,但是文件余下的部分会稍后再处理。
这意味着打开一个图像是最后的操作,它与文件大小和压缩类型无关。这里有一种简单的脚本可以块度地识别图像文件集:
Image类包含允许您操作图像内区域的方法。为了从图像中提取子矩形,使用crop()方法。
一个区域是一个4元组,其中坐标为(左,上,右,下)。该Python图像库使用左上角坐标为(0,0)的坐标系统。同样值得注意的是,坐标是指像素间的位置,因此上例中的区域正好为300x300的像素。
该区域现在能以某种方法进行处理并粘贴回去。
当将区域粘贴回去时,区域的大小必须准确地匹配给定的区域。此外,区域不能拓展到图像之外。然而,原始图像和区域的模式不必相匹。如果相同,则区域会在被粘贴前自动地转换(有关详细信息,请参阅下面的 颜色转换 部分)。
这里有一个额外的例子:
对于更高级的技巧,paste方法可以将透明掩码(transparency mask)作为可选参数。在掩码中,数值255被粘贴的图像在该位置是不透明的(即,被粘贴的图像就是原图粘贴)。数值0表示被粘贴的图像是完全透明的。在0和255之间的数值表示不同级别的透明程度。例如,粘贴一个RGBA图像并将其作为掩码会粘贴图像的不透明部分,但不会粘贴其透明背景。
该Python图像库也允许您在多频段图像中的单个频段中进行工作,例如RGB图像。split方法创造了新的图像集,每一个都包含了来自原始多频段图像的一个频段。合并函数将一个模式和图像组作为输入,并将其组合为新图像。下面示例交换了一个RGB图像的三个频段:
值得注意的是,对一个单波段图像而言, split() 返回图像本身。要在单个颜色频段上工作,您可能需要首先将图像转换为"RGB"。
PIL.Image.Image 类包含调整( resize() )和旋转( rotate() )一个图像的方法。前者通过输入元组来确定新的图片大小,后者通过输入的角度以逆时间旋转图片。
若要90度旋转图像,您即可以使用 rotate() 方法,也可以使用 transpose() 方法。后者还可以在水平或垂直轴周围翻转图像。
transpose(ROTATE)也可以和 rotate() 执行的结果相同,前提是rotate()中的expand标志设置为真,用以提供图像尺寸的相同更改。
图像转换的一种更一般的形式是通过 transform() 方法执行。
该Python图像库允许您使用convert()方法在不同的像素表示间转换图像。
该库可以在每个支持的模式和“L”以及“RGB”模式间进行转换。为了在其他模式间进行转换,您可能会使用到一个中间图像(通常为“RGB”图像)。
该Python图像库提供了大量的方法和模块用于增强图像。
ImageFilter 模块包含了许多能和 filter() 方法一起使用的预定义的增强过滤器。
point() 方法用于翻译图像的像素值(如图像对比度操作)。在多数情况下,一个函数对象期望一个传递给方法的参数。每一个像素都按照函数进行处理:
使用以上方法,您可以快速地在图像上应用任何简单的表达式。您还可以通过结合 point() 和 paste() 方法来有选择性地修改图像:
以下语法用于创造掩码:
Python仅评估确定结果所需的逻辑表达部分,并返回作为表达结果检查的最后值。因此,如果以上表达式为假(0),Python不再查看第二个操作数,并返回0。相反地,返回255。
对更先进的图像增强,您可以使用 ImageEnhance 模块中的类。一旦从图像创建,增强对象可用于快速尝试不同的设置。
您可以通过这种方式调整对比度、亮度、颜色平衡和锐度。
该Python图像库包含一些对图像序列(也称为动画支持)的基础支持。支持的序列格式包括FLI/FLC,GIF,以及一些实验格式。TIgFF文件还可以包含多个帧。
当您打开一个序列文件,PIL自动地导入序列的第一帧。您可以使用seek并告诉方法在不同帧之间移动:
如例所见,当序列结束时,您会得到一个 EOFError 异常。
下列类允许您使用for语句循环序列:
该Python图像库包含在PostScript打印机上打印图像、文本以及图形的功能。下面是一个简单的示例:
如早前描述的一样, Image 模块中的 open() 函数用于打开图像文件。在大部分情况下,您简单地传入文件名作为一个参数。Image.open能作为文本管理器:
您可以使用一个类文件对象来代替文件名。这个对戏必须实现必须实现file.read、file.seek和file.tell方法,且必须以二进制模式打开。
要从二进制数据中读取图像,请使用 Bytes10 类:
请注意,库在阅读图像头部之前会倒带文件(使用seek(0))。此外,当读取图像数据时(通过load方法),还将使用seek。如果图像文件嵌入到较大的文件中,例如tar文件,您可以使用 ContainerIO 或 TarIO 模块来访问它。
一些解码器允许您在从文件中读取图像时对其进行操作。这通常被用于创建缩略图(当速度远大于质量时)和打印到单色激光打印机(当只需要图像的灰度版本时)的解码过程。
draft()方法操纵打开但尚未加载的图像,以便尽可能与给定的模式和大小匹配。这是通过重新配置图像解码器来完成的。
这只适用于JPEG和MPO文件。
打印结果如下:
值得注意的是,生成的图像可能不会精确地匹配要求的模式和尺寸。为了确保图像不大于给定的尺寸,请使用thumbnail方法。