Python图像处理基础
对我个人而言使用Python图像处理意在取代matlab,集中化使用Python环境保证之后在机器学习和OpenCV的使用上具有一致性,虽然从实验室师兄师姐的口中得知Python的图像处理较之matlab相对复杂(应该只是代码量的问题),但我依然觉得学习python环境比较实用和高效。在进行Python图像处理之前,Pillow是不可或缺的实用性工具,pillow是Python Imaging Library的缩写,Pillow由PIL而来,导入该库使用import PIL。同时感谢Python社区内的翻译工作者,将pillow的英文稳当翻译为汉语文档。传统的PIL库不支持python3,所以使用从PIL派生出来的Pillow库。
从学习PIL开始
Python Imaging Library ( PIL ) 给 Python 增加了图像处理能力。这个库提供了广泛的文件格式支持,高效的内部展现,以及十分强大的图像处理能力。以下为我们常用的图像处理功能:
- 图像存储 PIL 设计用于图像归档和图像批量处理,可以使用它建立缩略图,转换格式,打印图片等。现在的版本可以验证和读取大量的图片格式。写入有意设计为只能写入常用的文件格式。
- 图像显示 现在的版本包含了 Tk PhotoImage 和 BitmapImage 接口, 以及 Windows DIB interface ,这有助于在 Windows 下使用。 为了方便测试,还提供了 show() 方法,可以保存图像到磁盘并显示。
- 图像处理 这个库包含了基本的图像处理功能,包括点操作,使用内置卷积内核过滤,色彩空间转换。支持更改图像大小、旋转、自由变换。有一个直方图方法允许你统计图像,这可以用于对比度增强和全局统计分析。
使用 Image 类
要从文件加载图像,使用 open() 函数, 在 Image 模块:
代码语言:javascript复制 @zhangziju
from PIL import Image ##调用库
im = Image.open("E:mywife.jpg") ##文件存在的路径
im.show()
需要知道的是在win的环境下im.show的方式为win自带的图像显示应用。
代码语言:javascript复制@zhangziju
from PIL import Image
im = Image.open("E:mywife.jpg")
print(im.format, im.size, im.mode) ## 打印出关键信息
im.show()
JPEG (750, 560) RGB ## 输出关键信息 同时再次看到我老婆
format 这个属性标识了图像来源。如果图像不是从文件读取它的值就是None。 size属性是一个二元元组,包含width、height(宽度和高度,单位都是px)。mode 属性定义了图像bands的数量和名称,以及像素类型和深度。 常见的modes 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像。如下表为常见的nodes描述。
modes | 描述 |
---|---|
1 | 1位像素,黑和白,存成8位的像素 |
L | 8位像素,黑白 |
P | 8位像素,使用调色板映射到任何其他模式 |
RGB | 3× 8位像素,真彩 |
RGBA | 4×8位像素,真彩 透明通道 |
CMYK | 4×8位像素,颜色隔离 |
YCbCr | 3×8位像素,彩色视频格式 |
I | 32位整型像素 |
F | 32位浮点型像素 |
读写图像
PIL 模块对目前存在的大多数图片格式都支持,一般使用 Image 模块的 open() 函数从磁盘读取文件,并不需要知道文件格式就能打开它,这个库能够根据文件内容自动确定文件格式。若要保存文件,则使用 Image 类的 save() 方法,此时保存文件的文件名就变得十分重要了,除非你指定格式,否则这个库将会以文件名的扩展名作为格式保存。
代码语言:javascript复制@zhangziju from PIL import Image im = Image.open("E:mywife.jpg") print(im) im.save("E:mywife.png") ## 将"E:mywife.jpg"保存为"E:mywife.png" im = Image.open("E:mywife.png") ##打开新的png图片 print(im.format, im.size, im.mode)
如下图,在指定路径下可看到新保存的png格式的图片。
此时在查看Python的输出信息
PNG (750, 560) RGB
通常而言,save用以保存一个临时的image对象到硬盘。而转换工作由一个功能更为强大的convert()方法来完成。convert()是将图像转换格式的类。
代码语言:javascript复制@zhangziju
from PIL import Image
im = Image.open("E:mywife.jpg")
new_im = im.convert('L') ##可以看到“L”模式的我老婆,即黑白模式
new_im.show() ##用以显示
“L”模式的gakki,同理,可转换其余几种格式,此处略去。
裁剪、复制、合并等操作
首先引入box的概念,box变量是一个四元组(左,上,右,下)。用来表示在原始图像中截取的位置坐标,如box(100,100,200,200)就表示在原始图像中以左上角为坐标原点,截取一个100*100(像素为单位)的图像,为方便理解,如下为示意图box(b1,a1,b2,a2)。作图软件为Visio2016。
代码语言:javascript复制@zhangziju
from PIL import Image
im = Image.open("E:mywife.jpg")
box = (300, 100, 700, 700) ##确定拷贝区域大小
region = im.crop(box) ##将im表示的图片对象拷贝到region中,大小为box
region.show()
如下图为box截取的图像区域显示。
crop函数带的参数为(起始点的横坐标,起始点的纵坐标,宽度,高度)。paste函数的参数为(需要修改的图片,粘贴的起始点的横坐标,粘贴的起始点的纵坐标)。(待补充)
代码语言:javascript复制@zhangziju
from PIL import Image
im = Image.open("E:mywife.jpg")
box = (300, 100, 700, 700)
region = im.crop(box)
region = region.transpose(Image.ROTATE_180) ##将拷贝的小图旋转180度再放入region中
im.paste(region, box) ##粘贴box大小的region到原先的图片对象中。
im.show()
box = im.copy( ) #直接复制图像
如下图所示为旋转和粘贴操作。
几何变换
Image类有resize()、rotate()和transpose()、transform()方法进行几何变换,用以重定义图片大小,对图片进行旋转等操作。
代码语言:javascript复制@zhangziju from PIL import Image im = Image.open("E:mywife.jpg") region = im.resize((400, 400)) ##重新设定大小 region.show()
很明显由于大小的重新设定,图片的显示效果有所转变,gakki依然美腻~
还可以做以下操作:
代码语言:javascript复制@zhangziju
im.rotate(45) #逆时针旋转 45 度角。
im.transpose(Image.FLIP_LEFT_RIGHT) #左右对换。
im.transpose(Image.FLIP_TOP_BOTTOM) #上下对换。
im.transpose(Image.ROTATE_90) #旋转 90 度角。
im.transpose(Image.ROTATE_180) #旋转 180 度角。
im.transpose(Image.ROTATE_270) #旋转 270 度角。
图像滤波
图像滤波在ImageFilter 模块中,在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。还有其他功能强大的滤波效果,此处略。
代码语言:javascript复制@zhangziju
from PIL import Image
from PIL import ImageFilter ## 调取ImageFilter
imgF = Image.open("E:mywife.jpg")
bluF = imgF.filter(ImageFilter.BLUR) ##均值滤波
conF = imgF.filter(ImageFilter.CONTOUR) ##找轮廓
edgeF = imgF.filter(ImageFilter.FIND_EDGES) ##边缘检测
imgF.show()
bluF.show()
conF.show()
edgeF.show()
滤波处理下的gakki~
图像增强
Pillow中的图像增强函数主要在ImageEnhance模块下,通过该模块可以调节图像的颜色、对比度和饱和度和锐化等。ImageEnhance模块的接口所有的增强类都实现了一个通用的接口,包括一个方法:
enhancer.enhance(factor) ⇒ image
该方法返回一个增强过的图像。变量factor是一个浮点数,控制图像的增强程度。变量factor为1将返回原始图像的拷贝;factor值越小,颜色越少(亮度,对比度等),同时对变量facotr并没有限制。
Color类
颜色增强类用于调整图像的颜色均衡,该类实现的增强接口如下:
ImageEnhance.Color(image) ⇒ Color enhancer instance
创建一个增强对象,以调整图像的颜色。增强因子为0.0将产生黑白图像;为1.0将给出原始图像。
代码语言:javascript复制@zhangziju from PIL import Image from PIL import ImageEnhance imcor=Image.open("E:mywife.jpg") im_01 = ImageEnhance.Color(imcor).enhance(0.1) im_10 = ImageEnhance.Color(imcor).enhance(1.0) im_30 =ImageEnhance.Color(imcor).enhance(3.0) im_01.show() im_10.show() im_30.show()
如下图为ImageEnhance.Color(image)在取值0.1、1.0和3.0时的效果图。
Brightness类
亮度增强类用于调整图像的亮度,该类实现的增强接口如下:
ImageEnhance.Brightness(image)⇒ Brightnessenhancer instance
创建一个调整图像亮度的增强对象。增强因子为0.0将产生黑色图像;为1.0将保持原始图像。
代码语言:javascript复制@zhangziju from PIL import Image from PIL import ImageEnhance imbri =Image.open("E:mywife.jpg") im_02 = ImageEnhance.Brightness(imbri).enhance(0.2) im_08 = ImageEnhance.Brightness(imbri).enhance(0.8) im_20 = ImageEnhance.Brightness(imbri).enhance(2.0) im_02.show() im_08.show() im_20.show()
如下图为ImageEnhance.Brightness(image)在取值0.2、0.8和2.0时的效果图。
Contrast类
对比度增强类用于调整图像的对比度。该类实现的增强接口如下:
ImageEnhance.Contrast(image) ⇒ Contrast enhancer instance
创建一个调整图像对比度的增强对象。增强因子为0.0将产生纯灰色图像;为1.0将保持原始图像。
代码语言:javascript复制@zhangziju
from PIL import Image
from PIL import ImageEnhance
imcon =Image.open("E:mywife.jpg")
im_02 = ImageEnhance.Contrast(imcon).enhance(0.2)
im_08 =ImageEnhance.Contrast (imcon).enhance(0.8)
im_20 =ImageEnhance.Contrast (imcon).enhance(2.0)
im_02.show()
im_08.show()
im_20.show()
如下图为ImageEnhance.Contrast(image)在取值0.2、0.8和2.0时的效果图。
同样的还有Sharpness锐度增强类用于调整图像的锐度。此处略。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181990.html原文链接:https://javaforall.cn